hw.c (4598702d1b3e0b6aa6694f4c786313a999afbdc9) hw.c (990de2b2e48ac377fb40842a9b04fd940ba78e1b)
1/*
2 * Copyright (c) 2008-2011 Atheros Communications Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES

--- 1515 unchanged lines hidden (view full) ---

1524 if (!(gpio_mask & 1))
1525 continue;
1526
1527 ath9k_hw_cfg_output(ah, i, AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
1528 ath9k_hw_set_gpio(ah, i, !!(ah->gpio_val & BIT(i)));
1529 }
1530}
1531
1/*
2 * Copyright (c) 2008-2011 Atheros Communications Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES

--- 1515 unchanged lines hidden (view full) ---

1524 if (!(gpio_mask & 1))
1525 continue;
1526
1527 ath9k_hw_cfg_output(ah, i, AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
1528 ath9k_hw_set_gpio(ah, i, !!(ah->gpio_val & BIT(i)));
1529 }
1530}
1531
1532static bool ath9k_hw_check_dcs(u32 dma_dbg, u32 num_dcu_states,
1533 int *hang_state, int *hang_pos)
1534{
1535 static u32 dcu_chain_state[] = {5, 6, 9}; /* DCU chain stuck states */
1536 u32 chain_state, dcs_pos, i;
1537
1538 for (dcs_pos = 0; dcs_pos < num_dcu_states; dcs_pos++) {
1539 chain_state = (dma_dbg >> (5 * dcs_pos)) & 0x1f;
1540 for (i = 0; i < 3; i++) {
1541 if (chain_state == dcu_chain_state[i]) {
1542 *hang_state = chain_state;
1543 *hang_pos = dcs_pos;
1544 return true;
1545 }
1546 }
1547 }
1548 return false;
1549}
1550
1551#define DCU_COMPLETE_STATE 1
1552#define DCU_COMPLETE_STATE_MASK 0x3
1553#define NUM_STATUS_READS 50
1554static bool ath9k_hw_detect_mac_hang(struct ath_hw *ah)
1555{
1556 u32 chain_state, comp_state, dcs_reg = AR_DMADBG_4;
1557 u32 i, hang_pos, hang_state, num_state = 6;
1558
1559 comp_state = REG_READ(ah, AR_DMADBG_6);
1560
1561 if ((comp_state & DCU_COMPLETE_STATE_MASK) != DCU_COMPLETE_STATE) {
1562 ath_dbg(ath9k_hw_common(ah), RESET,
1563 "MAC Hang signature not found at DCU complete\n");
1564 return false;
1565 }
1566
1567 chain_state = REG_READ(ah, dcs_reg);
1568 if (ath9k_hw_check_dcs(chain_state, num_state, &hang_state, &hang_pos))
1569 goto hang_check_iter;
1570
1571 dcs_reg = AR_DMADBG_5;
1572 num_state = 4;
1573 chain_state = REG_READ(ah, dcs_reg);
1574 if (ath9k_hw_check_dcs(chain_state, num_state, &hang_state, &hang_pos))
1575 goto hang_check_iter;
1576
1577 ath_dbg(ath9k_hw_common(ah), RESET,
1578 "MAC Hang signature 1 not found\n");
1579 return false;
1580
1581hang_check_iter:
1582 ath_dbg(ath9k_hw_common(ah), RESET,
1583 "DCU registers: chain %08x complete %08x Hang: state %d pos %d\n",
1584 chain_state, comp_state, hang_state, hang_pos);
1585
1586 for (i = 0; i < NUM_STATUS_READS; i++) {
1587 chain_state = REG_READ(ah, dcs_reg);
1588 chain_state = (chain_state >> (5 * hang_pos)) & 0x1f;
1589 comp_state = REG_READ(ah, AR_DMADBG_6);
1590
1591 if (((comp_state & DCU_COMPLETE_STATE_MASK) !=
1592 DCU_COMPLETE_STATE) ||
1593 (chain_state != hang_state))
1594 return false;
1595 }
1596
1597 ath_dbg(ath9k_hw_common(ah), RESET, "MAC Hang signature 1 found\n");
1598
1599 return true;
1600}
1601
1602void ath9k_hw_check_nav(struct ath_hw *ah)
1603{
1604 struct ath_common *common = ath9k_hw_common(ah);
1605 u32 val;
1606
1607 val = REG_READ(ah, AR_NAV);
1608 if (val != 0xdeadbeef && val > 0x7fff) {
1609 ath_dbg(common, BSTUCK, "Abnormal NAV: 0x%x\n", val);

--- 1592 unchanged lines hidden ---
1532void ath9k_hw_check_nav(struct ath_hw *ah)
1533{
1534 struct ath_common *common = ath9k_hw_common(ah);
1535 u32 val;
1536
1537 val = REG_READ(ah, AR_NAV);
1538 if (val != 0xdeadbeef && val > 0x7fff) {
1539 ath_dbg(common, BSTUCK, "Abnormal NAV: 0x%x\n", val);

--- 1592 unchanged lines hidden ---