@@ -192,6 +192,7 @@ static void cnic_ctx_wr(struct cnic_dev *dev, u32 cid_addr, u32 off, u32 val)
192192 struct drv_ctl_info info ;
193193 struct drv_ctl_io * io = & info .data .io ;
194194
195+ memset (& info , 0 , sizeof (struct drv_ctl_info ));
195196 info .cmd = DRV_CTL_CTX_WR_CMD ;
196197 io -> cid_addr = cid_addr ;
197198 io -> offset = off ;
@@ -206,6 +207,7 @@ static void cnic_ctx_tbl_wr(struct cnic_dev *dev, u32 off, dma_addr_t addr)
206207 struct drv_ctl_info info ;
207208 struct drv_ctl_io * io = & info .data .io ;
208209
210+ memset (& info , 0 , sizeof (struct drv_ctl_info ));
209211 info .cmd = DRV_CTL_CTXTBL_WR_CMD ;
210212 io -> offset = off ;
211213 io -> dma_addr = addr ;
@@ -219,6 +221,7 @@ static void cnic_ring_ctl(struct cnic_dev *dev, u32 cid, u32 cl_id, int start)
219221 struct drv_ctl_info info ;
220222 struct drv_ctl_l2_ring * ring = & info .data .ring ;
221223
224+ memset (& info , 0 , sizeof (struct drv_ctl_info ));
222225 if (start )
223226 info .cmd = DRV_CTL_START_L2_CMD ;
224227 else
@@ -236,6 +239,7 @@ static void cnic_reg_wr_ind(struct cnic_dev *dev, u32 off, u32 val)
236239 struct drv_ctl_info info ;
237240 struct drv_ctl_io * io = & info .data .io ;
238241
242+ memset (& info , 0 , sizeof (struct drv_ctl_info ));
239243 info .cmd = DRV_CTL_IO_WR_CMD ;
240244 io -> offset = off ;
241245 io -> data = val ;
@@ -249,20 +253,22 @@ static u32 cnic_reg_rd_ind(struct cnic_dev *dev, u32 off)
249253 struct drv_ctl_info info ;
250254 struct drv_ctl_io * io = & info .data .io ;
251255
256+ memset (& info , 0 , sizeof (struct drv_ctl_info ));
252257 info .cmd = DRV_CTL_IO_RD_CMD ;
253258 io -> offset = off ;
254259 ethdev -> drv_ctl (dev -> netdev , & info );
255260 return io -> data ;
256261}
257262
258- static void cnic_ulp_ctl (struct cnic_dev * dev , int ulp_type , bool reg )
263+ static void cnic_ulp_ctl (struct cnic_dev * dev , int ulp_type , bool reg , int state )
259264{
260265 struct cnic_local * cp = dev -> cnic_priv ;
261266 struct cnic_eth_dev * ethdev = cp -> ethdev ;
262267 struct drv_ctl_info info ;
263268 struct fcoe_capabilities * fcoe_cap =
264269 & info .data .register_data .fcoe_features ;
265270
271+ memset (& info , 0 , sizeof (struct drv_ctl_info ));
266272 if (reg ) {
267273 info .cmd = DRV_CTL_ULP_REGISTER_CMD ;
268274 if (ulp_type == CNIC_ULP_FCOE && dev -> fcoe_cap )
@@ -272,6 +278,7 @@ static void cnic_ulp_ctl(struct cnic_dev *dev, int ulp_type, bool reg)
272278 }
273279
274280 info .data .ulp_type = ulp_type ;
281+ info .drv_state = state ;
275282 ethdev -> drv_ctl (dev -> netdev , & info );
276283}
277284
@@ -286,6 +293,7 @@ static void cnic_spq_completion(struct cnic_dev *dev, int cmd, u32 count)
286293 struct cnic_eth_dev * ethdev = cp -> ethdev ;
287294 struct drv_ctl_info info ;
288295
296+ memset (& info , 0 , sizeof (struct drv_ctl_info ));
289297 info .cmd = cmd ;
290298 info .data .credit .credit_count = count ;
291299 ethdev -> drv_ctl (dev -> netdev , & info );
@@ -591,7 +599,7 @@ static int cnic_register_device(struct cnic_dev *dev, int ulp_type,
591599
592600 mutex_unlock (& cnic_lock );
593601
594- cnic_ulp_ctl (dev , ulp_type , true);
602+ cnic_ulp_ctl (dev , ulp_type , true, DRV_ACTIVE );
595603
596604 return 0 ;
597605
@@ -636,7 +644,10 @@ static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type)
636644 if (test_bit (ULP_F_CALL_PENDING , & cp -> ulp_flags [ulp_type ]))
637645 netdev_warn (dev -> netdev , "Failed waiting for ULP up call to complete\n" );
638646
639- cnic_ulp_ctl (dev , ulp_type , false);
647+ if (test_bit (ULP_F_INIT , & cp -> ulp_flags [ulp_type ]))
648+ cnic_ulp_ctl (dev , ulp_type , false, DRV_UNLOADED );
649+ else
650+ cnic_ulp_ctl (dev , ulp_type , false, DRV_INACTIVE );
640651
641652 return 0 ;
642653}
@@ -4267,6 +4278,7 @@ static void cnic_delete_task(struct work_struct *work)
42674278
42684279 cnic_ulp_stop_one (cp , CNIC_ULP_ISCSI );
42694280
4281+ memset (& info , 0 , sizeof (struct drv_ctl_info ));
42704282 info .cmd = DRV_CTL_ISCSI_STOPPED_CMD ;
42714283 cp -> ethdev -> drv_ctl (dev -> netdev , & info );
42724284 }
@@ -5433,6 +5445,23 @@ static void cnic_free_dev(struct cnic_dev *dev)
54335445 kfree (dev );
54345446}
54355447
5448+ static int cnic_get_fc_npiv_tbl (struct cnic_dev * dev ,
5449+ struct cnic_fc_npiv_tbl * npiv_tbl )
5450+ {
5451+ struct cnic_local * cp = dev -> cnic_priv ;
5452+ struct bnx2x * bp = netdev_priv (dev -> netdev );
5453+ int ret ;
5454+
5455+ if (!test_bit (CNIC_F_CNIC_UP , & dev -> flags ))
5456+ return - EAGAIN ; /* bnx2x is down */
5457+
5458+ if (!BNX2X_CHIP_IS_E2_PLUS (bp ))
5459+ return - EINVAL ;
5460+
5461+ ret = cp -> ethdev -> drv_get_fc_npiv_tbl (dev -> netdev , npiv_tbl );
5462+ return ret ;
5463+ }
5464+
54365465static struct cnic_dev * cnic_alloc_dev (struct net_device * dev ,
54375466 struct pci_dev * pdev )
54385467{
@@ -5451,6 +5480,7 @@ static struct cnic_dev *cnic_alloc_dev(struct net_device *dev,
54515480 cdev -> register_device = cnic_register_device ;
54525481 cdev -> unregister_device = cnic_unregister_device ;
54535482 cdev -> iscsi_nl_msg_recv = cnic_iscsi_nl_msg_recv ;
5483+ cdev -> get_fc_npiv_tbl = cnic_get_fc_npiv_tbl ;
54545484
54555485 cp = cdev -> cnic_priv ;
54565486 cp -> dev = cdev ;
0 commit comments