Commit 290d4de5b71f60bb5853a7ef9f0e8c817cd26892

Authored by Stephen Hemminger
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

... ... @@ -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;
... ... @@ -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;