Commit 290d4de5b71f60bb5853a7ef9f0e8c817cd26892
Committed by
Jeff Garzik
1 parent
6f059c3e90
[PATCH] sky2: remove support for untested Yukon EC/rev 0
The Yukon EC/rev0 (A1) chipset requires a bunch of workarounds. I copied these from sk98lin. But since they never got tested and add more cruft to the code; any attempt at using driver as is on this version will probably fail. It looks like this was a early engineering sample chip revision, if it ever shows up on a real system. Produce an error message. Signed-off-by: Stephen Hemminger <shemminger@osdl.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Showing 2 changed files with 32 additions and 63 deletions Side-by-side Diff
drivers/net/sky2.c
... | ... | @@ -61,10 +61,6 @@ |
61 | 61 | * a receive requires one (or two if using 64 bit dma). |
62 | 62 | */ |
63 | 63 | |
64 | -#define is_ec_a1(hw) \ | |
65 | - unlikely((hw)->chip_id == CHIP_ID_YUKON_EC && \ | |
66 | - (hw)->chip_rev == CHIP_REV_YU_EC_A1) | |
67 | - | |
68 | 64 | #define RX_LE_SIZE 512 |
69 | 65 | #define RX_LE_BYTES (RX_LE_SIZE*sizeof(struct sky2_rx_le)) |
70 | 66 | #define RX_MAX_PENDING (RX_LE_SIZE/2 - 2) |
71 | 67 | |
... | ... | @@ -725,37 +721,11 @@ |
725 | 721 | return le; |
726 | 722 | } |
727 | 723 | |
728 | -/* | |
729 | - * This is a workaround code taken from SysKonnect sk98lin driver | |
730 | - * to deal with chip bug on Yukon EC rev 0 in the wraparound case. | |
731 | - */ | |
732 | -static void sky2_put_idx(struct sky2_hw *hw, unsigned q, | |
733 | - u16 idx, u16 *last, u16 size) | |
724 | +/* Update chip's next pointer */ | |
725 | +static inline void sky2_put_idx(struct sky2_hw *hw, unsigned q, u16 idx) | |
734 | 726 | { |
735 | 727 | wmb(); |
736 | - if (is_ec_a1(hw) && idx < *last) { | |
737 | - u16 hwget = sky2_read16(hw, Y2_QADDR(q, PREF_UNIT_GET_IDX)); | |
738 | - | |
739 | - if (hwget == 0) { | |
740 | - /* Start prefetching again */ | |
741 | - sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 0xe0); | |
742 | - goto setnew; | |
743 | - } | |
744 | - | |
745 | - if (hwget == size - 1) { | |
746 | - /* set watermark to one list element */ | |
747 | - sky2_write8(hw, Y2_QADDR(q, PREF_UNIT_FIFO_WM), 8); | |
748 | - | |
749 | - /* set put index to first list element */ | |
750 | - sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), 0); | |
751 | - } else /* have hardware go to end of list */ | |
752 | - sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), | |
753 | - size - 1); | |
754 | - } else { | |
755 | -setnew: | |
756 | - sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), idx); | |
757 | - } | |
758 | - *last = idx; | |
728 | + sky2_write16(hw, Y2_QADDR(q, PREF_UNIT_PUT_IDX), idx); | |
759 | 729 | mmiowb(); |
760 | 730 | } |
761 | 731 | |
... | ... | @@ -1001,7 +971,6 @@ |
1001 | 971 | |
1002 | 972 | /* Tell chip about available buffers */ |
1003 | 973 | sky2_write16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX), sky2->rx_put); |
1004 | - sky2->rx_last_put = sky2_read16(hw, Y2_QADDR(rxq, PREF_UNIT_PUT_IDX)); | |
1005 | 974 | return 0; |
1006 | 975 | nomem: |
1007 | 976 | sky2_rx_clean(sky2); |
... | ... | @@ -1299,8 +1268,7 @@ |
1299 | 1268 | netif_stop_queue(dev); |
1300 | 1269 | } |
1301 | 1270 | |
1302 | - sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod, | |
1303 | - &sky2->tx_last_put, TX_RING_SIZE); | |
1271 | + sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod); | |
1304 | 1272 | |
1305 | 1273 | out_unlock: |
1306 | 1274 | spin_unlock(&sky2->tx_lock); |
... | ... | @@ -1843,8 +1811,7 @@ |
1843 | 1811 | sky2_rx_add(sky2, re->mapaddr); |
1844 | 1812 | |
1845 | 1813 | /* Tell receiver about new buffers. */ |
1846 | - sky2_put_idx(sky2->hw, rxqaddr[sky2->port], sky2->rx_put, | |
1847 | - &sky2->rx_last_put, RX_LE_SIZE); | |
1814 | + sky2_put_idx(sky2->hw, rxqaddr[sky2->port], sky2->rx_put); | |
1848 | 1815 | |
1849 | 1816 | return skb; |
1850 | 1817 | |
... | ... | @@ -2238,6 +2205,23 @@ |
2238 | 2205 | return -EOPNOTSUPP; |
2239 | 2206 | } |
2240 | 2207 | |
2208 | + hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4; | |
2209 | + | |
2210 | + /* This rev is really old, and requires untested workarounds */ | |
2211 | + if (hw->chip_id == CHIP_ID_YUKON_EC && hw->chip_rev == CHIP_REV_YU_EC_A1) { | |
2212 | + printk(KERN_ERR PFX "%s: unsupported revision Yukon-%s (0x%x) rev %d\n", | |
2213 | + pci_name(hw->pdev), yukon2_name[hw->chip_id - CHIP_ID_YUKON_XL], | |
2214 | + hw->chip_id, hw->chip_rev); | |
2215 | + return -EOPNOTSUPP; | |
2216 | + } | |
2217 | + | |
2218 | + /* This chip is new and not tested yet */ | |
2219 | + if (hw->chip_id == CHIP_ID_YUKON_EC_U) { | |
2220 | + pr_info(PFX "%s: is a version of Yukon 2 chipset that has not been tested yet.\n", | |
2221 | + pci_name(hw->pdev)); | |
2222 | + pr_info("Please report success/failure to maintainer <shemminger@osdl.org>\n"); | |
2223 | + } | |
2224 | + | |
2241 | 2225 | /* disable ASF */ |
2242 | 2226 | if (hw->chip_id <= CHIP_ID_YUKON_EC) { |
2243 | 2227 | sky2_write8(hw, B28_Y2_ASF_STAT_CMD, Y2_ASF_RESET); |
... | ... | @@ -2271,7 +2255,6 @@ |
2271 | 2255 | if (!(sky2_read8(hw, B2_Y2_CLK_GATE) & Y2_STATUS_LNK2_INAC)) |
2272 | 2256 | ++hw->ports; |
2273 | 2257 | } |
2274 | - hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4; | |
2275 | 2258 | |
2276 | 2259 | sky2_set_power_state(hw, PCI_D0); |
2277 | 2260 | |
2278 | 2261 | |
2279 | 2262 | |
2280 | 2263 | |
... | ... | @@ -2338,30 +2321,18 @@ |
2338 | 2321 | sky2_write16(hw, STAT_LAST_IDX, STATUS_RING_SIZE - 1); |
2339 | 2322 | |
2340 | 2323 | /* These status setup values are copied from SysKonnect's driver */ |
2341 | - if (is_ec_a1(hw)) { | |
2342 | - /* WA for dev. #4.3 */ | |
2343 | - sky2_write16(hw, STAT_TX_IDX_TH, 0xfff); /* Tx Threshold */ | |
2324 | + sky2_write16(hw, STAT_TX_IDX_TH, 10); | |
2325 | + sky2_write8(hw, STAT_FIFO_WM, 16); | |
2344 | 2326 | |
2345 | - /* set Status-FIFO watermark */ | |
2346 | - sky2_write8(hw, STAT_FIFO_WM, 0x21); /* WA for dev. #4.18 */ | |
2327 | + /* set Status-FIFO ISR watermark */ | |
2328 | + if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0) | |
2329 | + sky2_write8(hw, STAT_FIFO_ISR_WM, 4); | |
2330 | + else | |
2331 | + sky2_write8(hw, STAT_FIFO_ISR_WM, 16); | |
2347 | 2332 | |
2348 | - /* set Status-FIFO ISR watermark */ | |
2349 | - sky2_write8(hw, STAT_FIFO_ISR_WM, 0x07); /* WA for dev. #4.18 */ | |
2350 | - sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 10000)); | |
2351 | - } else { | |
2352 | - sky2_write16(hw, STAT_TX_IDX_TH, 10); | |
2353 | - sky2_write8(hw, STAT_FIFO_WM, 16); | |
2333 | + sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 1000)); | |
2334 | + sky2_write32(hw, STAT_ISR_TIMER_INI, sky2_us2clk(hw, 7)); | |
2354 | 2335 | |
2355 | - /* set Status-FIFO ISR watermark */ | |
2356 | - if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0) | |
2357 | - sky2_write8(hw, STAT_FIFO_ISR_WM, 4); | |
2358 | - else | |
2359 | - sky2_write8(hw, STAT_FIFO_ISR_WM, 16); | |
2360 | - | |
2361 | - sky2_write32(hw, STAT_TX_TIMER_INI, sky2_us2clk(hw, 1000)); | |
2362 | - sky2_write32(hw, STAT_ISR_TIMER_INI, sky2_us2clk(hw, 7)); | |
2363 | - } | |
2364 | - | |
2365 | 2336 | /* enable status unit */ |
2366 | 2337 | sky2_write32(hw, STAT_CTRL, SC_STAT_OP_ON); |
2367 | 2338 | |
... | ... | @@ -3091,7 +3062,7 @@ |
3091 | 3062 | INIT_WORK(&sky2->phy_task, sky2_phy_task, sky2); |
3092 | 3063 | init_MUTEX(&sky2->phy_sema); |
3093 | 3064 | sky2->tx_pending = TX_DEF_PENDING; |
3094 | - sky2->rx_pending = is_ec_a1(hw) ? 8 : RX_DEF_PENDING; | |
3065 | + sky2->rx_pending = RX_DEF_PENDING; | |
3095 | 3066 | sky2->rx_bufsize = sky2_buf_size(ETH_DATA_LEN); |
3096 | 3067 | |
3097 | 3068 | hw->dev[port] = dev; |
drivers/net/sky2.h
... | ... | @@ -1840,7 +1840,6 @@ |
1840 | 1840 | u16 tx_prod; /* next le to use */ |
1841 | 1841 | u32 tx_addr64; |
1842 | 1842 | u16 tx_pending; |
1843 | - u16 tx_last_put; | |
1844 | 1843 | u16 tx_last_mss; |
1845 | 1844 | |
1846 | 1845 | struct ring_info *rx_ring ____cacheline_aligned_in_smp; |
... | ... | @@ -1849,7 +1848,6 @@ |
1849 | 1848 | u16 rx_next; /* next re to check */ |
1850 | 1849 | u16 rx_put; /* next le index to use */ |
1851 | 1850 | u16 rx_pending; |
1852 | - u16 rx_last_put; | |
1853 | 1851 | u16 rx_bufsize; |
1854 | 1852 | #ifdef SKY2_VLAN_TAG_USED |
1855 | 1853 | u16 rx_tag; |