aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbevf
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-03-25 11:41:20 -0400
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-03-25 11:41:20 -0400
commit7bf7e370d5919112c223a269462cd0b546903829 (patch)
tree03ccc715239df14ae168277dbccc9d9cf4d8a2c8 /drivers/net/ixgbevf
parent68b1a1e786f29c900fa1c516a402e24f0ece622a (diff)
parentd39dd11c3e6a7af5c20bfac40594db36cf270f42 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into for-linus-1
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6: (9356 commits) [media] rc: update for bitop name changes fs: simplify iget & friends fs: pull inode->i_lock up out of writeback_single_inode fs: rename inode_lock to inode_hash_lock fs: move i_wb_list out from under inode_lock fs: move i_sb_list out from under inode_lock fs: remove inode_lock from iput_final and prune_icache fs: Lock the inode LRU list separately fs: factor inode disposal fs: protect inode->i_state with inode->i_lock lib, arch: add filter argument to show_mem and fix private implementations SLUB: Write to per cpu data when allocating it slub: Fix debugobjects with lockless fastpath autofs4: Do not potentially dereference NULL pointer returned by fget() in autofs_dev_ioctl_setpipefd() autofs4 - remove autofs4_lock autofs4 - fix d_manage() return on rcu-walk autofs4 - fix autofs4_expire_indirect() traversal autofs4 - fix dentry leak in autofs4_expire_direct() autofs4 - reinstate last used update on access vfs - check non-mountpoint dentry might block in __follow_mount_rcu() ... NOTE! This merge commit was created to fix compilation error. The block tree was merged upstream and removed the 'elv_queue_empty()' function which the new 'mtdswap' driver is using. So a simple merge of the mtd tree with upstream does not compile. And the mtd tree has already be published, so re-basing it is not an option. To fix this unfortunate situation, I had to merge upstream into the mtd-2.6.git tree without committing, put the fixup patch on top of this, and then commit this. The result is that we do not have commits which do not compile. In other words, this merge commit "merges" 3 things: the MTD tree, the upstream tree, and the fixup patch.
Diffstat (limited to 'drivers/net/ixgbevf')
-rw-r--r--drivers/net/ixgbevf/defines.h2
-rw-r--r--drivers/net/ixgbevf/ethtool.c4
-rw-r--r--drivers/net/ixgbevf/ixgbevf.h1
-rw-r--r--drivers/net/ixgbevf/ixgbevf_main.c98
-rw-r--r--drivers/net/ixgbevf/regs.h2
5 files changed, 34 insertions, 73 deletions
diff --git a/drivers/net/ixgbevf/defines.h b/drivers/net/ixgbevf/defines.h
index de643eb2ada6..78abb6f1a866 100644
--- a/drivers/net/ixgbevf/defines.h
+++ b/drivers/net/ixgbevf/defines.h
@@ -65,6 +65,8 @@ typedef u32 ixgbe_link_speed;
65#define IXGBE_RXCTRL_DMBYPS 0x00000002 /* Descriptor Monitor Bypass */ 65#define IXGBE_RXCTRL_DMBYPS 0x00000002 /* Descriptor Monitor Bypass */
66#define IXGBE_RXDCTL_ENABLE 0x02000000 /* Enable specific Rx Queue */ 66#define IXGBE_RXDCTL_ENABLE 0x02000000 /* Enable specific Rx Queue */
67#define IXGBE_RXDCTL_VME 0x40000000 /* VLAN mode enable */ 67#define IXGBE_RXDCTL_VME 0x40000000 /* VLAN mode enable */
68#define IXGBE_RXDCTL_RLPMLMASK 0x00003FFF /* Only supported on the X540 */
69#define IXGBE_RXDCTL_RLPML_EN 0x00008000
68 70
69/* DCA Control */ 71/* DCA Control */
70#define IXGBE_DCA_TXCTRL_TX_WB_RO_EN (1 << 11) /* Tx Desc writeback RO bit */ 72#define IXGBE_DCA_TXCTRL_TX_WB_RO_EN (1 << 11) /* Tx Desc writeback RO bit */
diff --git a/drivers/net/ixgbevf/ethtool.c b/drivers/net/ixgbevf/ethtool.c
index fa29b3c8c464..0563ab29264e 100644
--- a/drivers/net/ixgbevf/ethtool.c
+++ b/drivers/net/ixgbevf/ethtool.c
@@ -172,7 +172,7 @@ static char *ixgbevf_reg_names[] = {
172 "IXGBE_VFSTATUS", 172 "IXGBE_VFSTATUS",
173 "IXGBE_VFLINKS", 173 "IXGBE_VFLINKS",
174 "IXGBE_VFRXMEMWRAP", 174 "IXGBE_VFRXMEMWRAP",
175 "IXGBE_VFRTIMER", 175 "IXGBE_VFFRTIMER",
176 "IXGBE_VTEICR", 176 "IXGBE_VTEICR",
177 "IXGBE_VTEICS", 177 "IXGBE_VTEICS",
178 "IXGBE_VTEIMS", 178 "IXGBE_VTEIMS",
@@ -240,7 +240,7 @@ static void ixgbevf_get_regs(struct net_device *netdev,
240 regs_buff[1] = IXGBE_READ_REG(hw, IXGBE_VFSTATUS); 240 regs_buff[1] = IXGBE_READ_REG(hw, IXGBE_VFSTATUS);
241 regs_buff[2] = IXGBE_READ_REG(hw, IXGBE_VFLINKS); 241 regs_buff[2] = IXGBE_READ_REG(hw, IXGBE_VFLINKS);
242 regs_buff[3] = IXGBE_READ_REG(hw, IXGBE_VFRXMEMWRAP); 242 regs_buff[3] = IXGBE_READ_REG(hw, IXGBE_VFRXMEMWRAP);
243 regs_buff[4] = IXGBE_READ_REG(hw, IXGBE_VFRTIMER); 243 regs_buff[4] = IXGBE_READ_REG(hw, IXGBE_VFFRTIMER);
244 244
245 /* Interrupt */ 245 /* Interrupt */
246 /* don't read EICR because it can clear interrupt causes, instead 246 /* don't read EICR because it can clear interrupt causes, instead
diff --git a/drivers/net/ixgbevf/ixgbevf.h b/drivers/net/ixgbevf/ixgbevf.h
index a63efcb2cf1b..b703f60be3b7 100644
--- a/drivers/net/ixgbevf/ixgbevf.h
+++ b/drivers/net/ixgbevf/ixgbevf.h
@@ -207,7 +207,6 @@ struct ixgbevf_adapter {
207 u64 hw_tso_ctxt; 207 u64 hw_tso_ctxt;
208 u64 hw_tso6_ctxt; 208 u64 hw_tso6_ctxt;
209 u32 tx_timeout_count; 209 u32 tx_timeout_count;
210 bool detect_tx_hung;
211 210
212 /* RX */ 211 /* RX */
213 struct ixgbevf_ring *rx_ring; /* One per active queue */ 212 struct ixgbevf_ring *rx_ring; /* One per active queue */
diff --git a/drivers/net/ixgbevf/ixgbevf_main.c b/drivers/net/ixgbevf/ixgbevf_main.c
index 464e6c9d3fc2..054ab05b7c6a 100644
--- a/drivers/net/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ixgbevf/ixgbevf_main.c
@@ -49,9 +49,9 @@
49 49
50char ixgbevf_driver_name[] = "ixgbevf"; 50char ixgbevf_driver_name[] = "ixgbevf";
51static const char ixgbevf_driver_string[] = 51static const char ixgbevf_driver_string[] =
52 "Intel(R) 82599 Virtual Function"; 52 "Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver";
53 53
54#define DRV_VERSION "1.0.19-k0" 54#define DRV_VERSION "2.0.0-k2"
55const char ixgbevf_driver_version[] = DRV_VERSION; 55const char ixgbevf_driver_version[] = DRV_VERSION;
56static char ixgbevf_copyright[] = 56static char ixgbevf_copyright[] =
57 "Copyright (c) 2009 - 2010 Intel Corporation."; 57 "Copyright (c) 2009 - 2010 Intel Corporation.";
@@ -107,7 +107,7 @@ static inline void ixgbevf_release_rx_desc(struct ixgbe_hw *hw,
107} 107}
108 108
109/* 109/*
110 * ixgbe_set_ivar - set the IVAR registers, mapping interrupt causes to vectors 110 * ixgbevf_set_ivar - set IVAR registers - maps interrupt causes to vectors
111 * @adapter: pointer to adapter struct 111 * @adapter: pointer to adapter struct
112 * @direction: 0 for Rx, 1 for Tx, -1 for other causes 112 * @direction: 0 for Rx, 1 for Tx, -1 for other causes
113 * @queue: queue to map the corresponding interrupt to 113 * @queue: queue to map the corresponding interrupt to
@@ -162,42 +162,6 @@ static void ixgbevf_unmap_and_free_tx_resource(struct ixgbevf_adapter *adapter,
162 /* tx_buffer_info must be completely set up in the transmit path */ 162 /* tx_buffer_info must be completely set up in the transmit path */
163} 163}
164 164
165static inline bool ixgbevf_check_tx_hang(struct ixgbevf_adapter *adapter,
166 struct ixgbevf_ring *tx_ring,
167 unsigned int eop)
168{
169 struct ixgbe_hw *hw = &adapter->hw;
170 u32 head, tail;
171
172 /* Detect a transmit hang in hardware, this serializes the
173 * check with the clearing of time_stamp and movement of eop */
174 head = readl(hw->hw_addr + tx_ring->head);
175 tail = readl(hw->hw_addr + tx_ring->tail);
176 adapter->detect_tx_hung = false;
177 if ((head != tail) &&
178 tx_ring->tx_buffer_info[eop].time_stamp &&
179 time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ)) {
180 /* detected Tx unit hang */
181 union ixgbe_adv_tx_desc *tx_desc;
182 tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop);
183 printk(KERN_ERR "Detected Tx Unit Hang\n"
184 " Tx Queue <%d>\n"
185 " TDH, TDT <%x>, <%x>\n"
186 " next_to_use <%x>\n"
187 " next_to_clean <%x>\n"
188 "tx_buffer_info[next_to_clean]\n"
189 " time_stamp <%lx>\n"
190 " jiffies <%lx>\n",
191 tx_ring->queue_index,
192 head, tail,
193 tx_ring->next_to_use, eop,
194 tx_ring->tx_buffer_info[eop].time_stamp, jiffies);
195 return true;
196 }
197
198 return false;
199}
200
201#define IXGBE_MAX_TXD_PWR 14 165#define IXGBE_MAX_TXD_PWR 14
202#define IXGBE_MAX_DATA_PER_TXD (1 << IXGBE_MAX_TXD_PWR) 166#define IXGBE_MAX_DATA_PER_TXD (1 << IXGBE_MAX_TXD_PWR)
203 167
@@ -293,16 +257,6 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter,
293#endif 257#endif
294 } 258 }
295 259
296 if (adapter->detect_tx_hung) {
297 if (ixgbevf_check_tx_hang(adapter, tx_ring, i)) {
298 /* schedule immediate reset if we believe we hung */
299 printk(KERN_INFO
300 "tx hang %d detected, resetting adapter\n",
301 adapter->tx_timeout_count + 1);
302 ixgbevf_tx_timeout(adapter->netdev);
303 }
304 }
305
306 /* re-arm the interrupt */ 260 /* re-arm the interrupt */
307 if ((count >= tx_ring->work_limit) && 261 if ((count >= tx_ring->work_limit) &&
308 (!test_bit(__IXGBEVF_DOWN, &adapter->state))) { 262 (!test_bit(__IXGBEVF_DOWN, &adapter->state))) {
@@ -334,7 +288,6 @@ static void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector,
334 struct ixgbevf_adapter *adapter = q_vector->adapter; 288 struct ixgbevf_adapter *adapter = q_vector->adapter;
335 bool is_vlan = (status & IXGBE_RXD_STAT_VP); 289 bool is_vlan = (status & IXGBE_RXD_STAT_VP);
336 u16 tag = le16_to_cpu(rx_desc->wb.upper.vlan); 290 u16 tag = le16_to_cpu(rx_desc->wb.upper.vlan);
337 int ret;
338 291
339 if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) { 292 if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) {
340 if (adapter->vlgrp && is_vlan) 293 if (adapter->vlgrp && is_vlan)
@@ -345,9 +298,9 @@ static void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector,
345 napi_gro_receive(&q_vector->napi, skb); 298 napi_gro_receive(&q_vector->napi, skb);
346 } else { 299 } else {
347 if (adapter->vlgrp && is_vlan) 300 if (adapter->vlgrp && is_vlan)
348 ret = vlan_hwaccel_rx(skb, adapter->vlgrp, tag); 301 vlan_hwaccel_rx(skb, adapter->vlgrp, tag);
349 else 302 else
350 ret = netif_rx(skb); 303 netif_rx(skb);
351 } 304 }
352} 305}
353 306
@@ -1017,7 +970,7 @@ static irqreturn_t ixgbevf_msix_clean_tx(int irq, void *data)
1017} 970}
1018 971
1019/** 972/**
1020 * ixgbe_msix_clean_rx - single unshared vector rx clean (all queues) 973 * ixgbevf_msix_clean_rx - single unshared vector rx clean (all queues)
1021 * @irq: unused 974 * @irq: unused
1022 * @data: pointer to our q_vector struct for this interrupt vector 975 * @data: pointer to our q_vector struct for this interrupt vector
1023 **/ 976 **/
@@ -1665,6 +1618,11 @@ static int ixgbevf_up_complete(struct ixgbevf_adapter *adapter)
1665 j = adapter->rx_ring[i].reg_idx; 1618 j = adapter->rx_ring[i].reg_idx;
1666 rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)); 1619 rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j));
1667 rxdctl |= IXGBE_RXDCTL_ENABLE; 1620 rxdctl |= IXGBE_RXDCTL_ENABLE;
1621 if (hw->mac.type == ixgbe_mac_X540_vf) {
1622 rxdctl &= ~IXGBE_RXDCTL_RLPMLMASK;
1623 rxdctl |= ((netdev->mtu + ETH_HLEN + ETH_FCS_LEN) |
1624 IXGBE_RXDCTL_RLPML_EN);
1625 }
1668 IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl); 1626 IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
1669 ixgbevf_rx_desc_queue_enable(adapter, i); 1627 ixgbevf_rx_desc_queue_enable(adapter, i);
1670 } 1628 }
@@ -1967,7 +1925,7 @@ static void ixgbevf_acquire_msix_vectors(struct ixgbevf_adapter *adapter,
1967} 1925}
1968 1926
1969/* 1927/*
1970 * ixgbe_set_num_queues: Allocate queues for device, feature dependant 1928 * ixgbevf_set_num_queues: Allocate queues for device, feature dependant
1971 * @adapter: board private structure to initialize 1929 * @adapter: board private structure to initialize
1972 * 1930 *
1973 * This is the top level queue allocation routine. The order here is very 1931 * This is the top level queue allocation routine. The order here is very
@@ -2216,7 +2174,7 @@ static int __devinit ixgbevf_sw_init(struct ixgbevf_adapter *adapter)
2216 2174
2217 hw->vendor_id = pdev->vendor; 2175 hw->vendor_id = pdev->vendor;
2218 hw->device_id = pdev->device; 2176 hw->device_id = pdev->device;
2219 pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id); 2177 hw->revision_id = pdev->revision;
2220 hw->subsystem_vendor_id = pdev->subsystem_vendor; 2178 hw->subsystem_vendor_id = pdev->subsystem_vendor;
2221 hw->subsystem_device_id = pdev->subsystem_device; 2179 hw->subsystem_device_id = pdev->subsystem_device;
2222 2180
@@ -2410,9 +2368,6 @@ static void ixgbevf_watchdog_task(struct work_struct *work)
2410 10 : 1); 2368 10 : 1);
2411 netif_carrier_on(netdev); 2369 netif_carrier_on(netdev);
2412 netif_tx_wake_all_queues(netdev); 2370 netif_tx_wake_all_queues(netdev);
2413 } else {
2414 /* Force detection of hung controller */
2415 adapter->detect_tx_hung = true;
2416 } 2371 }
2417 } else { 2372 } else {
2418 adapter->link_up = false; 2373 adapter->link_up = false;
@@ -2427,9 +2382,6 @@ static void ixgbevf_watchdog_task(struct work_struct *work)
2427 ixgbevf_update_stats(adapter); 2382 ixgbevf_update_stats(adapter);
2428 2383
2429pf_has_reset: 2384pf_has_reset:
2430 /* Force detection of hung controller every watchdog period */
2431 adapter->detect_tx_hung = true;
2432
2433 /* Reset the timer */ 2385 /* Reset the timer */
2434 if (!test_bit(__IXGBEVF_DOWN, &adapter->state)) 2386 if (!test_bit(__IXGBEVF_DOWN, &adapter->state))
2435 mod_timer(&adapter->watchdog_timer, 2387 mod_timer(&adapter->watchdog_timer,
@@ -3217,10 +3169,16 @@ static int ixgbevf_set_mac(struct net_device *netdev, void *p)
3217static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu) 3169static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu)
3218{ 3170{
3219 struct ixgbevf_adapter *adapter = netdev_priv(netdev); 3171 struct ixgbevf_adapter *adapter = netdev_priv(netdev);
3172 struct ixgbe_hw *hw = &adapter->hw;
3220 int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; 3173 int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
3174 int max_possible_frame = MAXIMUM_ETHERNET_VLAN_SIZE;
3175 u32 msg[2];
3176
3177 if (adapter->hw.mac.type == ixgbe_mac_X540_vf)
3178 max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE;
3221 3179
3222 /* MTU < 68 is an error and causes problems on some kernels */ 3180 /* MTU < 68 is an error and causes problems on some kernels */
3223 if ((new_mtu < 68) || (max_frame > MAXIMUM_ETHERNET_VLAN_SIZE)) 3181 if ((new_mtu < 68) || (max_frame > max_possible_frame))
3224 return -EINVAL; 3182 return -EINVAL;
3225 3183
3226 hw_dbg(&adapter->hw, "changing MTU from %d to %d\n", 3184 hw_dbg(&adapter->hw, "changing MTU from %d to %d\n",
@@ -3228,6 +3186,10 @@ static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu)
3228 /* must set new MTU before calling down or up */ 3186 /* must set new MTU before calling down or up */
3229 netdev->mtu = new_mtu; 3187 netdev->mtu = new_mtu;
3230 3188
3189 msg[0] = IXGBE_VF_SET_LPE;
3190 msg[1] = max_frame;
3191 hw->mbx.ops.write_posted(hw, msg, 2);
3192
3231 if (netif_running(netdev)) 3193 if (netif_running(netdev))
3232 ixgbevf_reinit_locked(adapter); 3194 ixgbevf_reinit_locked(adapter);
3233 3195
@@ -3272,8 +3234,6 @@ static const struct net_device_ops ixgbe_netdev_ops = {
3272 3234
3273static void ixgbevf_assign_netdev_ops(struct net_device *dev) 3235static void ixgbevf_assign_netdev_ops(struct net_device *dev)
3274{ 3236{
3275 struct ixgbevf_adapter *adapter;
3276 adapter = netdev_priv(dev);
3277 dev->netdev_ops = &ixgbe_netdev_ops; 3237 dev->netdev_ops = &ixgbe_netdev_ops;
3278 ixgbevf_set_ethtool_ops(dev); 3238 ixgbevf_set_ethtool_ops(dev);
3279 dev->watchdog_timeo = 5 * HZ; 3239 dev->watchdog_timeo = 5 * HZ;
@@ -3519,9 +3479,9 @@ static struct pci_driver ixgbevf_driver = {
3519}; 3479};
3520 3480
3521/** 3481/**
3522 * ixgbe_init_module - Driver Registration Routine 3482 * ixgbevf_init_module - Driver Registration Routine
3523 * 3483 *
3524 * ixgbe_init_module is the first routine called when the driver is 3484 * ixgbevf_init_module is the first routine called when the driver is
3525 * loaded. All it does is register with the PCI subsystem. 3485 * loaded. All it does is register with the PCI subsystem.
3526 **/ 3486 **/
3527static int __init ixgbevf_init_module(void) 3487static int __init ixgbevf_init_module(void)
@@ -3539,9 +3499,9 @@ static int __init ixgbevf_init_module(void)
3539module_init(ixgbevf_init_module); 3499module_init(ixgbevf_init_module);
3540 3500
3541/** 3501/**
3542 * ixgbe_exit_module - Driver Exit Cleanup Routine 3502 * ixgbevf_exit_module - Driver Exit Cleanup Routine
3543 * 3503 *
3544 * ixgbe_exit_module is called just before the driver is removed 3504 * ixgbevf_exit_module is called just before the driver is removed
3545 * from memory. 3505 * from memory.
3546 **/ 3506 **/
3547static void __exit ixgbevf_exit_module(void) 3507static void __exit ixgbevf_exit_module(void)
@@ -3551,7 +3511,7 @@ static void __exit ixgbevf_exit_module(void)
3551 3511
3552#ifdef DEBUG 3512#ifdef DEBUG
3553/** 3513/**
3554 * ixgbe_get_hw_dev_name - return device name string 3514 * ixgbevf_get_hw_dev_name - return device name string
3555 * used by hardware layer to print debugging information 3515 * used by hardware layer to print debugging information
3556 **/ 3516 **/
3557char *ixgbevf_get_hw_dev_name(struct ixgbe_hw *hw) 3517char *ixgbevf_get_hw_dev_name(struct ixgbe_hw *hw)
diff --git a/drivers/net/ixgbevf/regs.h b/drivers/net/ixgbevf/regs.h
index fb80ca1bcc93..189200eeca26 100644
--- a/drivers/net/ixgbevf/regs.h
+++ b/drivers/net/ixgbevf/regs.h
@@ -31,7 +31,7 @@
31#define IXGBE_VFCTRL 0x00000 31#define IXGBE_VFCTRL 0x00000
32#define IXGBE_VFSTATUS 0x00008 32#define IXGBE_VFSTATUS 0x00008
33#define IXGBE_VFLINKS 0x00010 33#define IXGBE_VFLINKS 0x00010
34#define IXGBE_VFRTIMER 0x00048 34#define IXGBE_VFFRTIMER 0x00048
35#define IXGBE_VFRXMEMWRAP 0x03190 35#define IXGBE_VFRXMEMWRAP 0x03190
36#define IXGBE_VTEICR 0x00100 36#define IXGBE_VTEICR 0x00100
37#define IXGBE_VTEICS 0x00104 37#define IXGBE_VTEICS 0x00104