@@ -283,6 +283,35 @@ static void ixgbe_service_event_schedule(struct ixgbe_adapter *adapter)
283
283
schedule_work (& adapter -> service_task );
284
284
}
285
285
286
+ static void ixgbe_remove_adapter (struct ixgbe_hw * hw )
287
+ {
288
+ struct ixgbe_adapter * adapter = hw -> back ;
289
+
290
+ if (!hw -> hw_addr )
291
+ return ;
292
+ hw -> hw_addr = NULL ;
293
+ e_dev_err ("Adapter removed\n" );
294
+ }
295
+
296
+ void ixgbe_check_remove (struct ixgbe_hw * hw , u32 reg )
297
+ {
298
+ u32 value ;
299
+
300
+ /* The following check not only optimizes a bit by not
301
+ * performing a read on the status register when the
302
+ * register just read was a status register read that
303
+ * returned IXGBE_FAILED_READ_REG. It also blocks any
304
+ * potential recursion.
305
+ */
306
+ if (reg == IXGBE_STATUS ) {
307
+ ixgbe_remove_adapter (hw );
308
+ return ;
309
+ }
310
+ value = ixgbe_read_reg (hw , IXGBE_STATUS );
311
+ if (value == IXGBE_FAILED_READ_REG )
312
+ ixgbe_remove_adapter (hw );
313
+ }
314
+
286
315
static void ixgbe_service_event_complete (struct ixgbe_adapter * adapter )
287
316
{
288
317
BUG_ON (!test_bit (__IXGBE_SERVICE_SCHED , & adapter -> state ));
@@ -2970,7 +2999,7 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter,
2970
2999
ring -> count * sizeof (union ixgbe_adv_tx_desc ));
2971
3000
IXGBE_WRITE_REG (hw , IXGBE_TDH (reg_idx ), 0 );
2972
3001
IXGBE_WRITE_REG (hw , IXGBE_TDT (reg_idx ), 0 );
2973
- ring -> tail = hw -> hw_addr + IXGBE_TDT (reg_idx );
3002
+ ring -> tail = adapter -> io_addr + IXGBE_TDT (reg_idx );
2974
3003
2975
3004
/*
2976
3005
* set WTHRESH to encourage burst writeback, it should not be set
@@ -3373,7 +3402,7 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,
3373
3402
ring -> count * sizeof (union ixgbe_adv_rx_desc ));
3374
3403
IXGBE_WRITE_REG (hw , IXGBE_RDH (reg_idx ), 0 );
3375
3404
IXGBE_WRITE_REG (hw , IXGBE_RDT (reg_idx ), 0 );
3376
- ring -> tail = hw -> hw_addr + IXGBE_RDT (reg_idx );
3405
+ ring -> tail = adapter -> io_addr + IXGBE_RDT (reg_idx );
3377
3406
3378
3407
ixgbe_configure_srrctl (adapter , ring );
3379
3408
ixgbe_configure_rscctl (adapter , ring );
@@ -7880,6 +7909,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
7880
7909
7881
7910
hw -> hw_addr = ioremap (pci_resource_start (pdev , 0 ),
7882
7911
pci_resource_len (pdev , 0 ));
7912
+ adapter -> io_addr = hw -> hw_addr ;
7883
7913
if (!hw -> hw_addr ) {
7884
7914
err = - EIO ;
7885
7915
goto err_ioremap ;
@@ -8188,7 +8218,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
8188
8218
err_sw_init :
8189
8219
ixgbe_disable_sriov (adapter );
8190
8220
adapter -> flags2 &= ~IXGBE_FLAG2_SEARCH_FOR_SFP ;
8191
- iounmap (hw -> hw_addr );
8221
+ iounmap (adapter -> io_addr );
8192
8222
err_ioremap :
8193
8223
free_netdev (netdev );
8194
8224
err_alloc_etherdev :
@@ -8255,7 +8285,7 @@ static void ixgbe_remove(struct pci_dev *pdev)
8255
8285
kfree (adapter -> ixgbe_ieee_ets );
8256
8286
8257
8287
#endif
8258
- iounmap (adapter -> hw . hw_addr );
8288
+ iounmap (adapter -> io_addr );
8259
8289
pci_release_selected_regions (pdev , pci_select_bars (pdev ,
8260
8290
IORESOURCE_MEM ));
8261
8291
0 commit comments