@@ -505,6 +505,7 @@ static int qla4xxx_update_ddb_entry(struct scsi_qla_host *ha,
505
505
struct dev_db_entry * fw_ddb_entry = NULL ;
506
506
dma_addr_t fw_ddb_entry_dma ;
507
507
int status = QLA_ERROR ;
508
+ uint32_t conn_err ;
508
509
509
510
if (ddb_entry == NULL ) {
510
511
DEBUG2 (printk ("scsi%ld: %s: ddb_entry is NULL\n" , ha -> host_no ,
@@ -525,7 +526,7 @@ static int qla4xxx_update_ddb_entry(struct scsi_qla_host *ha,
525
526
526
527
if (qla4xxx_get_fwddb_entry (ha , fw_ddb_index , fw_ddb_entry ,
527
528
fw_ddb_entry_dma , NULL , NULL ,
528
- & ddb_entry -> fw_ddb_device_state , NULL ,
529
+ & ddb_entry -> fw_ddb_device_state , & conn_err ,
529
530
& ddb_entry -> tcp_source_port_num ,
530
531
& ddb_entry -> connection_id ) ==
531
532
QLA_ERROR ) {
@@ -578,12 +579,26 @@ static int qla4xxx_update_ddb_entry(struct scsi_qla_host *ha,
578
579
fw_ddb_entry -> link_local_ipv6_addr ,
579
580
min (sizeof (ddb_entry -> link_local_ipv6_addr ),
580
581
sizeof (fw_ddb_entry -> link_local_ipv6_addr )));
581
- }
582
-
583
- DEBUG2 (printk ("scsi%ld: %s: ddb[%d] - State= %x status= %d.\n" ,
584
- ha -> host_no , __func__ , fw_ddb_index ,
585
- ddb_entry -> fw_ddb_device_state , status ));
586
582
583
+ DEBUG2 (dev_info (& ha -> pdev -> dev , "%s: DDB[%d] osIdx = %d "
584
+ "State %04x ConnErr %08x IP %pI6 "
585
+ ":%04d \"%s\"\n" ,
586
+ __func__ , fw_ddb_index ,
587
+ ddb_entry -> os_target_id ,
588
+ ddb_entry -> fw_ddb_device_state ,
589
+ conn_err , fw_ddb_entry -> ip_addr ,
590
+ le16_to_cpu (fw_ddb_entry -> port ),
591
+ fw_ddb_entry -> iscsi_name ));
592
+ } else
593
+ DEBUG2 (dev_info (& ha -> pdev -> dev , "%s: DDB[%d] osIdx = %d "
594
+ "State %04x ConnErr %08x IP %pI4 "
595
+ ":%04d \"%s\"\n" ,
596
+ __func__ , fw_ddb_index ,
597
+ ddb_entry -> os_target_id ,
598
+ ddb_entry -> fw_ddb_device_state ,
599
+ conn_err , fw_ddb_entry -> ip_addr ,
600
+ le16_to_cpu (fw_ddb_entry -> port ),
601
+ fw_ddb_entry -> iscsi_name ));
587
602
exit_update_ddb :
588
603
if (fw_ddb_entry )
589
604
dma_free_coherent (& ha -> pdev -> dev , sizeof (* fw_ddb_entry ),
@@ -629,6 +644,40 @@ static struct ddb_entry * qla4xxx_alloc_ddb(struct scsi_qla_host *ha,
629
644
return ddb_entry ;
630
645
}
631
646
647
+ /**
648
+ * qla4_is_relogin_allowed - Are we allowed to login?
649
+ * @ha: Pointer to host adapter structure.
650
+ * @conn_err: Last connection error associated with the ddb
651
+ *
652
+ * This routine tests the given connection error to determine if
653
+ * we are allowed to login.
654
+ **/
655
+ int qla4_is_relogin_allowed (struct scsi_qla_host * ha , uint32_t conn_err )
656
+ {
657
+ uint32_t err_code , login_rsp_sts_class ;
658
+ int relogin = 1 ;
659
+
660
+ err_code = ((conn_err & 0x00ff0000 ) >> 16 );
661
+ login_rsp_sts_class = ((conn_err & 0x0000ff00 ) >> 8 );
662
+ if (err_code == 0x1c || err_code == 0x06 ) {
663
+ DEBUG2 (dev_info (& ha -> pdev -> dev ,
664
+ ": conn_err=0x%08x, send target completed"
665
+ " or access denied failure\n" , conn_err ));
666
+ relogin = 0 ;
667
+ }
668
+ if ((err_code == 0x08 ) && (login_rsp_sts_class == 0x02 )) {
669
+ /* Login Response PDU returned an error.
670
+ Login Response Status in Error Code Detail
671
+ indicates login should not be retried.*/
672
+ DEBUG2 (dev_info (& ha -> pdev -> dev ,
673
+ ": conn_err=0x%08x, do not retry relogin\n" ,
674
+ conn_err ));
675
+ relogin = 0 ;
676
+ }
677
+
678
+ return relogin ;
679
+ }
680
+
632
681
/**
633
682
* qla4xxx_configure_ddbs - builds driver ddb list
634
683
* @ha: Pointer to host adapter structure.
@@ -643,18 +692,30 @@ static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha)
643
692
uint32_t fw_ddb_index = 0 ;
644
693
uint32_t next_fw_ddb_index = 0 ;
645
694
uint32_t ddb_state ;
646
- uint32_t conn_err , err_code ;
695
+ uint32_t conn_err ;
647
696
struct ddb_entry * ddb_entry ;
697
+ struct dev_db_entry * fw_ddb_entry = NULL ;
698
+ dma_addr_t fw_ddb_entry_dma ;
699
+ uint32_t ipv6_device ;
648
700
uint32_t new_tgt ;
649
701
702
+ fw_ddb_entry = dma_alloc_coherent (& ha -> pdev -> dev , sizeof (* fw_ddb_entry ),
703
+ & fw_ddb_entry_dma , GFP_KERNEL );
704
+ if (fw_ddb_entry == NULL ) {
705
+ DEBUG2 (dev_info (& ha -> pdev -> dev , "%s: DMA alloc failed\n" ,
706
+ __func__ ));
707
+ return QLA_ERROR ;
708
+ }
709
+
650
710
dev_info (& ha -> pdev -> dev , "Initializing DDBs ...\n" );
651
711
for (fw_ddb_index = 0 ; fw_ddb_index < MAX_DDB_ENTRIES ;
652
712
fw_ddb_index = next_fw_ddb_index ) {
653
713
/* First, let's see if a device exists here */
654
- if (qla4xxx_get_fwddb_entry (ha , fw_ddb_index , NULL , 0 , NULL ,
655
- & next_fw_ddb_index , & ddb_state ,
656
- & conn_err , NULL , NULL ) ==
657
- QLA_ERROR ) {
714
+ if (qla4xxx_get_fwddb_entry (ha , fw_ddb_index , fw_ddb_entry ,
715
+ 0 , NULL , & next_fw_ddb_index ,
716
+ & ddb_state , & conn_err ,
717
+ NULL , NULL ) ==
718
+ QLA_ERROR ) {
658
719
DEBUG2 (printk ("scsi%ld: %s: get_ddb_entry, "
659
720
"fw_ddb_index %d failed" , ha -> host_no ,
660
721
__func__ , fw_ddb_index ));
@@ -671,18 +732,19 @@ static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha)
671
732
/* Try and login to device */
672
733
DEBUG2 (printk ("scsi%ld: %s: Login to DDB[%d]\n" ,
673
734
ha -> host_no , __func__ , fw_ddb_index ));
674
- err_code = ((conn_err & 0x00ff0000 ) >> 16 );
675
- if (err_code == 0x1c || err_code == 0x06 ) {
676
- DEBUG2 (printk ("scsi%ld: %s send target "
677
- "completed "
678
- "or access denied failure\n" ,
679
- ha -> host_no , __func__ ));
680
- } else {
735
+ ipv6_device = le16_to_cpu (fw_ddb_entry -> options ) &
736
+ DDB_OPT_IPV6_DEVICE ;
737
+ if (qla4_is_relogin_allowed (ha , conn_err ) &&
738
+ ((!ipv6_device &&
739
+ * ((uint32_t * )fw_ddb_entry -> ip_addr ))
740
+ || ipv6_device )) {
681
741
qla4xxx_set_ddb_entry (ha , fw_ddb_index , 0 );
682
742
if (qla4xxx_get_fwddb_entry (ha , fw_ddb_index ,
683
- NULL , 0 , NULL , & next_fw_ddb_index ,
684
- & ddb_state , & conn_err , NULL , NULL )
685
- == QLA_ERROR ) {
743
+ NULL , 0 , NULL ,
744
+ & next_fw_ddb_index ,
745
+ & ddb_state , & conn_err ,
746
+ NULL , NULL )
747
+ == QLA_ERROR ) {
686
748
DEBUG2 (printk ("scsi%ld: %s:"
687
749
"get_ddb_entry %d failed\n" ,
688
750
ha -> host_no ,
@@ -737,7 +799,6 @@ static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha)
737
799
struct qla4_relog_scan {
738
800
int halt_wait ;
739
801
uint32_t conn_err ;
740
- uint32_t err_code ;
741
802
uint32_t fw_ddb_index ;
742
803
uint32_t next_fw_ddb_index ;
743
804
uint32_t fw_ddb_device_state ;
@@ -747,18 +808,7 @@ static int qla4_test_rdy(struct scsi_qla_host *ha, struct qla4_relog_scan *rs)
747
808
{
748
809
struct ddb_entry * ddb_entry ;
749
810
750
- /*
751
- * Don't want to do a relogin if connection
752
- * error is 0x1c.
753
- */
754
- rs -> err_code = ((rs -> conn_err & 0x00ff0000 ) >> 16 );
755
- if (rs -> err_code == 0x1c || rs -> err_code == 0x06 ) {
756
- DEBUG2 (printk (
757
- "scsi%ld: %s send target"
758
- " completed or "
759
- "access denied failure\n" ,
760
- ha -> host_no , __func__ ));
761
- } else {
811
+ if (qla4_is_relogin_allowed (ha , rs -> conn_err )) {
762
812
/* We either have a device that is in
763
813
* the process of relogging in or a
764
814
* device that is waiting to be
@@ -1411,8 +1461,8 @@ static void qla4xxx_add_device_dynamically(struct scsi_qla_host *ha,
1411
1461
*
1412
1462
* This routine processes a Decive Database Changed AEN Event.
1413
1463
**/
1414
- int qla4xxx_process_ddb_changed (struct scsi_qla_host * ha ,
1415
- uint32_t fw_ddb_index , uint32_t state )
1464
+ int qla4xxx_process_ddb_changed (struct scsi_qla_host * ha , uint32_t fw_ddb_index ,
1465
+ uint32_t state , uint32_t conn_err )
1416
1466
{
1417
1467
struct ddb_entry * ddb_entry ;
1418
1468
uint32_t old_fw_ddb_device_state ;
@@ -1470,21 +1520,21 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha,
1470
1520
1471
1521
/*
1472
1522
* Relogin if device state changed to a not active state.
1473
- * However, do not relogin if this aen is a result of an IOCTL
1474
- * logout (DF_NO_RELOGIN) or if this is a discovered device .
1523
+ * However, do not relogin if a RELOGIN is in process, or
1524
+ * we are not allowed to relogin to this DDB .
1475
1525
*/
1476
1526
if (ddb_entry -> fw_ddb_device_state == DDB_DS_SESSION_FAILED &&
1477
1527
!test_bit (DF_RELOGIN , & ddb_entry -> flags ) &&
1478
1528
!test_bit (DF_NO_RELOGIN , & ddb_entry -> flags ) &&
1479
- ! test_bit ( DF_ISNS_DISCOVERED , & ddb_entry -> flags )) {
1529
+ qla4_is_relogin_allowed ( ha , conn_err )) {
1480
1530
/*
1481
1531
* This triggers a relogin. After the relogin_timer
1482
1532
* expires, the relogin gets scheduled. We must wait a
1483
1533
* minimum amount of time since receiving an 0x8014 AEN
1484
1534
* with failed device_state or a logout response before
1485
1535
* we can issue another relogin.
1486
1536
*/
1487
- /* Firmware padds this timeout: (time2wait +1).
1537
+ /* Firmware pads this timeout: (time2wait +1).
1488
1538
* Driver retry to login should be longer than F/W.
1489
1539
* Otherwise F/W will fail
1490
1540
* set_ddb() mbx cmd with 0x4005 since it still
0 commit comments