@@ -1593,6 +1593,40 @@ qla_enode_stop(scsi_qla_host_t *vha)
1593
1593
spin_unlock_irqrestore (& vha -> pur_cinfo .pur_lock , flags );
1594
1594
}
1595
1595
1596
+ static void qla_enode_clear (scsi_qla_host_t * vha , port_id_t portid )
1597
+ {
1598
+ unsigned long flags ;
1599
+ struct enode * e , * tmp ;
1600
+ struct purexevent * purex ;
1601
+ LIST_HEAD (enode_list );
1602
+
1603
+ if (vha -> pur_cinfo .enode_flags != ENODE_ACTIVE ) {
1604
+ ql_dbg (ql_dbg_edif , vha , 0x09102 ,
1605
+ "%s enode not active\n" , __func__ );
1606
+ return ;
1607
+ }
1608
+ spin_lock_irqsave (& vha -> pur_cinfo .pur_lock , flags );
1609
+ list_for_each_entry_safe (e , tmp , & vha -> pur_cinfo .head , list ) {
1610
+ purex = & e -> u .purexinfo ;
1611
+ if (purex -> pur_info .pur_sid .b24 == portid .b24 ) {
1612
+ ql_dbg (ql_dbg_edif , vha , 0x911d ,
1613
+ "%s free ELS sid=%06x. xchg %x, nb=%xh\n" ,
1614
+ __func__ , portid .b24 ,
1615
+ purex -> pur_info .pur_rx_xchg_address ,
1616
+ purex -> pur_info .pur_bytes_rcvd );
1617
+
1618
+ list_del_init (& e -> list );
1619
+ list_add_tail (& e -> list , & enode_list );
1620
+ }
1621
+ }
1622
+ spin_unlock_irqrestore (& vha -> pur_cinfo .pur_lock , flags );
1623
+
1624
+ list_for_each_entry_safe (e , tmp , & enode_list , list ) {
1625
+ list_del_init (& e -> list );
1626
+ qla_enode_free (vha , e );
1627
+ }
1628
+ }
1629
+
1596
1630
/*
1597
1631
* allocate enode struct and populate buffer
1598
1632
* returns: enode pointer with buffers
@@ -1792,6 +1826,57 @@ qla_edb_node_free(scsi_qla_host_t *vha, struct edb_node *node)
1792
1826
node -> ntype = N_UNDEF ;
1793
1827
}
1794
1828
1829
+ static void qla_edb_clear (scsi_qla_host_t * vha , port_id_t portid )
1830
+ {
1831
+ unsigned long flags ;
1832
+ struct edb_node * e , * tmp ;
1833
+ port_id_t sid ;
1834
+ LIST_HEAD (edb_list );
1835
+
1836
+ if (vha -> e_dbell .db_flags != EDB_ACTIVE ) {
1837
+ /* doorbell list not enabled */
1838
+ ql_dbg (ql_dbg_edif , vha , 0x09102 ,
1839
+ "%s doorbell not enabled\n" , __func__ );
1840
+ return ;
1841
+ }
1842
+
1843
+ /* grab lock so list doesn't move */
1844
+ spin_lock_irqsave (& vha -> e_dbell .db_lock , flags );
1845
+ list_for_each_entry_safe (e , tmp , & vha -> e_dbell .head , list ) {
1846
+ switch (e -> ntype ) {
1847
+ case VND_CMD_AUTH_STATE_NEEDED :
1848
+ case VND_CMD_AUTH_STATE_SESSION_SHUTDOWN :
1849
+ sid = e -> u .plogi_did ;
1850
+ break ;
1851
+ case VND_CMD_AUTH_STATE_ELS_RCVD :
1852
+ sid = e -> u .els_sid ;
1853
+ break ;
1854
+ case VND_CMD_AUTH_STATE_SAUPDATE_COMPL :
1855
+ /* app wants to see this */
1856
+ continue ;
1857
+ default :
1858
+ ql_log (ql_log_warn , vha , 0x09102 ,
1859
+ "%s unknown node type: %x\n" , __func__ , e -> ntype );
1860
+ sid .b24 = 0 ;
1861
+ break ;
1862
+ }
1863
+ if (sid .b24 == portid .b24 ) {
1864
+ ql_dbg (ql_dbg_edif , vha , 0x910f ,
1865
+ "%s free doorbell event : node type = %x %p\n" ,
1866
+ __func__ , e -> ntype , e );
1867
+ list_del_init (& e -> list );
1868
+ list_add_tail (& e -> list , & edb_list );
1869
+ }
1870
+ }
1871
+ spin_unlock_irqrestore (& vha -> e_dbell .db_lock , flags );
1872
+
1873
+ list_for_each_entry_safe (e , tmp , & edb_list , list ) {
1874
+ qla_edb_node_free (vha , e );
1875
+ list_del_init (& e -> list );
1876
+ kfree (e );
1877
+ }
1878
+ }
1879
+
1795
1880
/* function called when app is stopping */
1796
1881
1797
1882
void
@@ -2378,7 +2463,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
2378
2463
ql_dbg (ql_dbg_edif , host , 0x0910c ,
2379
2464
"%s COMPLETE purex->pur_info.pur_bytes_rcvd =%xh s:%06x -> d:%06x xchg=%xh\n" ,
2380
2465
__func__ , purex -> pur_info .pur_bytes_rcvd , purex -> pur_info .pur_sid .b24 ,
2381
- purex -> pur_info .pur_did .b24 , p -> rx_xchg_addr );
2466
+ purex -> pur_info .pur_did .b24 , purex -> pur_info . pur_rx_xchg_address );
2382
2467
2383
2468
qla_edb_eventcreate (host , VND_CMD_AUTH_STATE_ELS_RCVD , sid , 0 , NULL );
2384
2469
}
@@ -3401,3 +3486,12 @@ void qla_edif_sess_down(struct scsi_qla_host *vha, struct fc_port *sess)
3401
3486
qla2x00_post_aen_work (vha , FCH_EVT_PORT_OFFLINE , sess -> d_id .b24 );
3402
3487
}
3403
3488
}
3489
+
3490
+ void qla_edif_clear_appdata (struct scsi_qla_host * vha , struct fc_port * fcport )
3491
+ {
3492
+ if (!(fcport -> flags & FCF_FCSP_DEVICE ))
3493
+ return ;
3494
+
3495
+ qla_edb_clear (vha , fcport -> d_id );
3496
+ qla_enode_clear (vha , fcport -> d_id );
3497
+ }
0 commit comments