Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vmxnet3: Register shutdown handler for device (fwd)

Implement a handler for pci shutdown so that the driver has an
opportunity to make sure that device is quiesced before the PCI
switches to legacy IRQs. This way the possibility of
"screaming interrupt" is avoided.

Acked-by: Shrikrishna Khare <skhare@vmware.com>
Signed-off-by: Shreyas N Bhatewara <sbhatewara@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Shreyas Bhatewara and committed by
David S. Miller
e9ba47bf 8405a8ff

+27
+27
drivers/net/vmxnet3/vmxnet3_drv.c
··· 3184 3184 free_netdev(netdev); 3185 3185 } 3186 3186 3187 + static void vmxnet3_shutdown_device(struct pci_dev *pdev) 3188 + { 3189 + struct net_device *netdev = pci_get_drvdata(pdev); 3190 + struct vmxnet3_adapter *adapter = netdev_priv(netdev); 3191 + unsigned long flags; 3192 + 3193 + /* Reset_work may be in the middle of resetting the device, wait for its 3194 + * completion. 3195 + */ 3196 + while (test_and_set_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state)) 3197 + msleep(1); 3198 + 3199 + if (test_and_set_bit(VMXNET3_STATE_BIT_QUIESCED, 3200 + &adapter->state)) { 3201 + clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state); 3202 + return; 3203 + } 3204 + spin_lock_irqsave(&adapter->cmd_lock, flags); 3205 + VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 3206 + VMXNET3_CMD_QUIESCE_DEV); 3207 + spin_unlock_irqrestore(&adapter->cmd_lock, flags); 3208 + vmxnet3_disable_all_intrs(adapter); 3209 + 3210 + clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state); 3211 + } 3212 + 3187 3213 3188 3214 #ifdef CONFIG_PM 3189 3215 ··· 3386 3360 .id_table = vmxnet3_pciid_table, 3387 3361 .probe = vmxnet3_probe_device, 3388 3362 .remove = vmxnet3_remove_device, 3363 + .shutdown = vmxnet3_shutdown_device, 3389 3364 #ifdef CONFIG_PM 3390 3365 .driver.pm = &vmxnet3_pm_ops, 3391 3366 #endif