diff options
Diffstat (limited to 'drivers/net/igb/igb_main.c')
-rw-r--r-- | drivers/net/igb/igb_main.c | 115 |
1 files changed, 77 insertions, 38 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 4962cdfc507c..9331e5212461 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -231,6 +231,40 @@ static void __exit igb_exit_module(void) | |||
231 | 231 | ||
232 | module_exit(igb_exit_module); | 232 | module_exit(igb_exit_module); |
233 | 233 | ||
234 | #define Q_IDX_82576(i) (((i & 0x1) << 3) + (i >> 1)) | ||
235 | /** | ||
236 | * igb_cache_ring_register - Descriptor ring to register mapping | ||
237 | * @adapter: board private structure to initialize | ||
238 | * | ||
239 | * Once we know the feature-set enabled for the device, we'll cache | ||
240 | * the register offset the descriptor ring is assigned to. | ||
241 | **/ | ||
242 | static void igb_cache_ring_register(struct igb_adapter *adapter) | ||
243 | { | ||
244 | int i; | ||
245 | |||
246 | switch (adapter->hw.mac.type) { | ||
247 | case e1000_82576: | ||
248 | /* The queues are allocated for virtualization such that VF 0 | ||
249 | * is allocated queues 0 and 8, VF 1 queues 1 and 9, etc. | ||
250 | * In order to avoid collision we start at the first free queue | ||
251 | * and continue consuming queues in the same sequence | ||
252 | */ | ||
253 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
254 | adapter->rx_ring[i].reg_idx = Q_IDX_82576(i); | ||
255 | for (i = 0; i < adapter->num_tx_queues; i++) | ||
256 | adapter->tx_ring[i].reg_idx = Q_IDX_82576(i); | ||
257 | break; | ||
258 | case e1000_82575: | ||
259 | default: | ||
260 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
261 | adapter->rx_ring[i].reg_idx = i; | ||
262 | for (i = 0; i < adapter->num_tx_queues; i++) | ||
263 | adapter->tx_ring[i].reg_idx = i; | ||
264 | break; | ||
265 | } | ||
266 | } | ||
267 | |||
234 | /** | 268 | /** |
235 | * igb_alloc_queues - Allocate memory for all rings | 269 | * igb_alloc_queues - Allocate memory for all rings |
236 | * @adapter: board private structure to initialize | 270 | * @adapter: board private structure to initialize |
@@ -272,6 +306,8 @@ static int igb_alloc_queues(struct igb_adapter *adapter) | |||
272 | /* set a default napi handler for each rx_ring */ | 306 | /* set a default napi handler for each rx_ring */ |
273 | netif_napi_add(adapter->netdev, &ring->napi, igb_poll, 64); | 307 | netif_napi_add(adapter->netdev, &ring->napi, igb_poll, 64); |
274 | } | 308 | } |
309 | |||
310 | igb_cache_ring_register(adapter); | ||
275 | return 0; | 311 | return 0; |
276 | } | 312 | } |
277 | 313 | ||
@@ -312,36 +348,36 @@ static void igb_assign_vector(struct igb_adapter *adapter, int rx_queue, | |||
312 | array_wr32(E1000_MSIXBM(0), msix_vector, msixbm); | 348 | array_wr32(E1000_MSIXBM(0), msix_vector, msixbm); |
313 | break; | 349 | break; |
314 | case e1000_82576: | 350 | case e1000_82576: |
315 | /* The 82576 uses a table-based method for assigning vectors. | 351 | /* 82576 uses a table-based method for assigning vectors. |
316 | Each queue has a single entry in the table to which we write | 352 | Each queue has a single entry in the table to which we write |
317 | a vector number along with a "valid" bit. Sadly, the layout | 353 | a vector number along with a "valid" bit. Sadly, the layout |
318 | of the table is somewhat counterintuitive. */ | 354 | of the table is somewhat counterintuitive. */ |
319 | if (rx_queue > IGB_N0_QUEUE) { | 355 | if (rx_queue > IGB_N0_QUEUE) { |
320 | index = (rx_queue & 0x7); | 356 | index = (rx_queue >> 1); |
321 | ivar = array_rd32(E1000_IVAR0, index); | 357 | ivar = array_rd32(E1000_IVAR0, index); |
322 | if (rx_queue < 8) { | 358 | if (rx_queue & 0x1) { |
323 | /* vector goes into low byte of register */ | ||
324 | ivar = ivar & 0xFFFFFF00; | ||
325 | ivar |= msix_vector | E1000_IVAR_VALID; | ||
326 | } else { | ||
327 | /* vector goes into third byte of register */ | 359 | /* vector goes into third byte of register */ |
328 | ivar = ivar & 0xFF00FFFF; | 360 | ivar = ivar & 0xFF00FFFF; |
329 | ivar |= (msix_vector | E1000_IVAR_VALID) << 16; | 361 | ivar |= (msix_vector | E1000_IVAR_VALID) << 16; |
362 | } else { | ||
363 | /* vector goes into low byte of register */ | ||
364 | ivar = ivar & 0xFFFFFF00; | ||
365 | ivar |= msix_vector | E1000_IVAR_VALID; | ||
330 | } | 366 | } |
331 | adapter->rx_ring[rx_queue].eims_value= 1 << msix_vector; | 367 | adapter->rx_ring[rx_queue].eims_value= 1 << msix_vector; |
332 | array_wr32(E1000_IVAR0, index, ivar); | 368 | array_wr32(E1000_IVAR0, index, ivar); |
333 | } | 369 | } |
334 | if (tx_queue > IGB_N0_QUEUE) { | 370 | if (tx_queue > IGB_N0_QUEUE) { |
335 | index = (tx_queue & 0x7); | 371 | index = (tx_queue >> 1); |
336 | ivar = array_rd32(E1000_IVAR0, index); | 372 | ivar = array_rd32(E1000_IVAR0, index); |
337 | if (tx_queue < 8) { | 373 | if (tx_queue & 0x1) { |
338 | /* vector goes into second byte of register */ | ||
339 | ivar = ivar & 0xFFFF00FF; | ||
340 | ivar |= (msix_vector | E1000_IVAR_VALID) << 8; | ||
341 | } else { | ||
342 | /* vector goes into high byte of register */ | 374 | /* vector goes into high byte of register */ |
343 | ivar = ivar & 0x00FFFFFF; | 375 | ivar = ivar & 0x00FFFFFF; |
344 | ivar |= (msix_vector | E1000_IVAR_VALID) << 24; | 376 | ivar |= (msix_vector | E1000_IVAR_VALID) << 24; |
377 | } else { | ||
378 | /* vector goes into second byte of register */ | ||
379 | ivar = ivar & 0xFFFF00FF; | ||
380 | ivar |= (msix_vector | E1000_IVAR_VALID) << 8; | ||
345 | } | 381 | } |
346 | adapter->tx_ring[tx_queue].eims_value= 1 << msix_vector; | 382 | adapter->tx_ring[tx_queue].eims_value= 1 << msix_vector; |
347 | array_wr32(E1000_IVAR0, index, ivar); | 383 | array_wr32(E1000_IVAR0, index, ivar); |
@@ -1638,33 +1674,33 @@ static void igb_configure_tx(struct igb_adapter *adapter) | |||
1638 | struct e1000_hw *hw = &adapter->hw; | 1674 | struct e1000_hw *hw = &adapter->hw; |
1639 | u32 tctl; | 1675 | u32 tctl; |
1640 | u32 txdctl, txctrl; | 1676 | u32 txdctl, txctrl; |
1641 | int i; | 1677 | int i, j; |
1642 | 1678 | ||
1643 | for (i = 0; i < adapter->num_tx_queues; i++) { | 1679 | for (i = 0; i < adapter->num_tx_queues; i++) { |
1644 | struct igb_ring *ring = &(adapter->tx_ring[i]); | 1680 | struct igb_ring *ring = &(adapter->tx_ring[i]); |
1645 | 1681 | j = ring->reg_idx; | |
1646 | wr32(E1000_TDLEN(i), | 1682 | wr32(E1000_TDLEN(j), |
1647 | ring->count * sizeof(struct e1000_tx_desc)); | 1683 | ring->count * sizeof(struct e1000_tx_desc)); |
1648 | tdba = ring->dma; | 1684 | tdba = ring->dma; |
1649 | wr32(E1000_TDBAL(i), | 1685 | wr32(E1000_TDBAL(j), |
1650 | tdba & 0x00000000ffffffffULL); | 1686 | tdba & 0x00000000ffffffffULL); |
1651 | wr32(E1000_TDBAH(i), tdba >> 32); | 1687 | wr32(E1000_TDBAH(j), tdba >> 32); |
1652 | 1688 | ||
1653 | ring->head = E1000_TDH(i); | 1689 | ring->head = E1000_TDH(j); |
1654 | ring->tail = E1000_TDT(i); | 1690 | ring->tail = E1000_TDT(j); |
1655 | writel(0, hw->hw_addr + ring->tail); | 1691 | writel(0, hw->hw_addr + ring->tail); |
1656 | writel(0, hw->hw_addr + ring->head); | 1692 | writel(0, hw->hw_addr + ring->head); |
1657 | txdctl = rd32(E1000_TXDCTL(i)); | 1693 | txdctl = rd32(E1000_TXDCTL(j)); |
1658 | txdctl |= E1000_TXDCTL_QUEUE_ENABLE; | 1694 | txdctl |= E1000_TXDCTL_QUEUE_ENABLE; |
1659 | wr32(E1000_TXDCTL(i), txdctl); | 1695 | wr32(E1000_TXDCTL(j), txdctl); |
1660 | 1696 | ||
1661 | /* Turn off Relaxed Ordering on head write-backs. The | 1697 | /* Turn off Relaxed Ordering on head write-backs. The |
1662 | * writebacks MUST be delivered in order or it will | 1698 | * writebacks MUST be delivered in order or it will |
1663 | * completely screw up our bookeeping. | 1699 | * completely screw up our bookeeping. |
1664 | */ | 1700 | */ |
1665 | txctrl = rd32(E1000_DCA_TXCTRL(i)); | 1701 | txctrl = rd32(E1000_DCA_TXCTRL(j)); |
1666 | txctrl &= ~E1000_DCA_TXCTRL_TX_WB_RO_EN; | 1702 | txctrl &= ~E1000_DCA_TXCTRL_TX_WB_RO_EN; |
1667 | wr32(E1000_DCA_TXCTRL(i), txctrl); | 1703 | wr32(E1000_DCA_TXCTRL(j), txctrl); |
1668 | } | 1704 | } |
1669 | 1705 | ||
1670 | 1706 | ||
@@ -1781,7 +1817,7 @@ static void igb_setup_rctl(struct igb_adapter *adapter) | |||
1781 | struct e1000_hw *hw = &adapter->hw; | 1817 | struct e1000_hw *hw = &adapter->hw; |
1782 | u32 rctl; | 1818 | u32 rctl; |
1783 | u32 srrctl = 0; | 1819 | u32 srrctl = 0; |
1784 | int i; | 1820 | int i, j; |
1785 | 1821 | ||
1786 | rctl = rd32(E1000_RCTL); | 1822 | rctl = rd32(E1000_RCTL); |
1787 | 1823 | ||
@@ -1839,8 +1875,10 @@ static void igb_setup_rctl(struct igb_adapter *adapter) | |||
1839 | srrctl |= E1000_SRRCTL_DESCTYPE_ADV_ONEBUF; | 1875 | srrctl |= E1000_SRRCTL_DESCTYPE_ADV_ONEBUF; |
1840 | } | 1876 | } |
1841 | 1877 | ||
1842 | for (i = 0; i < adapter->num_rx_queues; i++) | 1878 | for (i = 0; i < adapter->num_rx_queues; i++) { |
1843 | wr32(E1000_SRRCTL(i), srrctl); | 1879 | j = adapter->rx_ring[i].reg_idx; |
1880 | wr32(E1000_SRRCTL(j), srrctl); | ||
1881 | } | ||
1844 | 1882 | ||
1845 | wr32(E1000_RCTL, rctl); | 1883 | wr32(E1000_RCTL, rctl); |
1846 | } | 1884 | } |
@@ -1857,7 +1895,7 @@ static void igb_configure_rx(struct igb_adapter *adapter) | |||
1857 | struct e1000_hw *hw = &adapter->hw; | 1895 | struct e1000_hw *hw = &adapter->hw; |
1858 | u32 rctl, rxcsum; | 1896 | u32 rctl, rxcsum; |
1859 | u32 rxdctl; | 1897 | u32 rxdctl; |
1860 | int i; | 1898 | int i, j; |
1861 | 1899 | ||
1862 | /* disable receives while setting up the descriptors */ | 1900 | /* disable receives while setting up the descriptors */ |
1863 | rctl = rd32(E1000_RCTL); | 1901 | rctl = rd32(E1000_RCTL); |
@@ -1872,25 +1910,26 @@ static void igb_configure_rx(struct igb_adapter *adapter) | |||
1872 | * the Base and Length of the Rx Descriptor Ring */ | 1910 | * the Base and Length of the Rx Descriptor Ring */ |
1873 | for (i = 0; i < adapter->num_rx_queues; i++) { | 1911 | for (i = 0; i < adapter->num_rx_queues; i++) { |
1874 | struct igb_ring *ring = &(adapter->rx_ring[i]); | 1912 | struct igb_ring *ring = &(adapter->rx_ring[i]); |
1913 | j = ring->reg_idx; | ||
1875 | rdba = ring->dma; | 1914 | rdba = ring->dma; |
1876 | wr32(E1000_RDBAL(i), | 1915 | wr32(E1000_RDBAL(j), |
1877 | rdba & 0x00000000ffffffffULL); | 1916 | rdba & 0x00000000ffffffffULL); |
1878 | wr32(E1000_RDBAH(i), rdba >> 32); | 1917 | wr32(E1000_RDBAH(j), rdba >> 32); |
1879 | wr32(E1000_RDLEN(i), | 1918 | wr32(E1000_RDLEN(j), |
1880 | ring->count * sizeof(union e1000_adv_rx_desc)); | 1919 | ring->count * sizeof(union e1000_adv_rx_desc)); |
1881 | 1920 | ||
1882 | ring->head = E1000_RDH(i); | 1921 | ring->head = E1000_RDH(j); |
1883 | ring->tail = E1000_RDT(i); | 1922 | ring->tail = E1000_RDT(j); |
1884 | writel(0, hw->hw_addr + ring->tail); | 1923 | writel(0, hw->hw_addr + ring->tail); |
1885 | writel(0, hw->hw_addr + ring->head); | 1924 | writel(0, hw->hw_addr + ring->head); |
1886 | 1925 | ||
1887 | rxdctl = rd32(E1000_RXDCTL(i)); | 1926 | rxdctl = rd32(E1000_RXDCTL(j)); |
1888 | rxdctl |= E1000_RXDCTL_QUEUE_ENABLE; | 1927 | rxdctl |= E1000_RXDCTL_QUEUE_ENABLE; |
1889 | rxdctl &= 0xFFF00000; | 1928 | rxdctl &= 0xFFF00000; |
1890 | rxdctl |= IGB_RX_PTHRESH; | 1929 | rxdctl |= IGB_RX_PTHRESH; |
1891 | rxdctl |= IGB_RX_HTHRESH << 8; | 1930 | rxdctl |= IGB_RX_HTHRESH << 8; |
1892 | rxdctl |= IGB_RX_WTHRESH << 16; | 1931 | rxdctl |= IGB_RX_WTHRESH << 16; |
1893 | wr32(E1000_RXDCTL(i), rxdctl); | 1932 | wr32(E1000_RXDCTL(j), rxdctl); |
1894 | #ifdef CONFIG_IGB_LRO | 1933 | #ifdef CONFIG_IGB_LRO |
1895 | /* Intitial LRO Settings */ | 1934 | /* Intitial LRO Settings */ |
1896 | ring->lro_mgr.max_aggr = MAX_LRO_AGGR; | 1935 | ring->lro_mgr.max_aggr = MAX_LRO_AGGR; |
@@ -1920,7 +1959,7 @@ static void igb_configure_rx(struct igb_adapter *adapter) | |||
1920 | shift = 6; | 1959 | shift = 6; |
1921 | for (j = 0; j < (32 * 4); j++) { | 1960 | for (j = 0; j < (32 * 4); j++) { |
1922 | reta.bytes[j & 3] = | 1961 | reta.bytes[j & 3] = |
1923 | (j % adapter->num_rx_queues) << shift; | 1962 | adapter->rx_ring[(j % adapter->num_rx_queues)].reg_idx << shift; |
1924 | if ((j & 3) == 3) | 1963 | if ((j & 3) == 3) |
1925 | writel(reta.dword, | 1964 | writel(reta.dword, |
1926 | hw->hw_addr + E1000_RETA(0) + (j & ~3)); | 1965 | hw->hw_addr + E1000_RETA(0) + (j & ~3)); |
@@ -3365,7 +3404,7 @@ static void igb_update_rx_dca(struct igb_ring *rx_ring) | |||
3365 | struct igb_adapter *adapter = rx_ring->adapter; | 3404 | struct igb_adapter *adapter = rx_ring->adapter; |
3366 | struct e1000_hw *hw = &adapter->hw; | 3405 | struct e1000_hw *hw = &adapter->hw; |
3367 | int cpu = get_cpu(); | 3406 | int cpu = get_cpu(); |
3368 | int q = rx_ring - adapter->rx_ring; | 3407 | int q = rx_ring->reg_idx; |
3369 | 3408 | ||
3370 | if (rx_ring->cpu != cpu) { | 3409 | if (rx_ring->cpu != cpu) { |
3371 | dca_rxctrl = rd32(E1000_DCA_RXCTRL(q)); | 3410 | dca_rxctrl = rd32(E1000_DCA_RXCTRL(q)); |
@@ -3392,7 +3431,7 @@ static void igb_update_tx_dca(struct igb_ring *tx_ring) | |||
3392 | struct igb_adapter *adapter = tx_ring->adapter; | 3431 | struct igb_adapter *adapter = tx_ring->adapter; |
3393 | struct e1000_hw *hw = &adapter->hw; | 3432 | struct e1000_hw *hw = &adapter->hw; |
3394 | int cpu = get_cpu(); | 3433 | int cpu = get_cpu(); |
3395 | int q = tx_ring - adapter->tx_ring; | 3434 | int q = tx_ring->reg_idx; |
3396 | 3435 | ||
3397 | if (tx_ring->cpu != cpu) { | 3436 | if (tx_ring->cpu != cpu) { |
3398 | dca_txctrl = rd32(E1000_DCA_TXCTRL(q)); | 3437 | dca_txctrl = rd32(E1000_DCA_TXCTRL(q)); |