Skip to content

Commit 4f93c4b

Browse files
mrangankarmartinkpetersen
authored andcommitted
scsi: qedi: Add PCI shutdown handler support
Add PCI shutdown handler support for supporting wake-on-lan feature. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Manish Rangankar <[email protected]> Signed-off-by: Nilesh Javali <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 4b1068f commit 4f93c4b

File tree

5 files changed

+39
-2
lines changed

5 files changed

+39
-2
lines changed

drivers/scsi/qedi/qedi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ struct qedi_endpoint;
3636
*/
3737
#define QEDI_MODE_NORMAL 0
3838
#define QEDI_MODE_RECOVERY 1
39+
#define QEDI_MODE_SHUTDOWN 2
3940

4041
#define ISCSI_WQE_SET_PTU_INVALIDATE 1
4142
#define QEDI_MAX_ISCSI_TASK 4096
@@ -278,6 +279,7 @@ struct qedi_ctx {
278279
#define QEDI_IOTHREAD_WAKE 2
279280
#define QEDI_IN_RECOVERY 5
280281
#define QEDI_IN_OFFLINE 6
282+
#define QEDI_IN_SHUTDOWN 7
281283

282284
u8 mac[ETH_ALEN];
283285
u32 src_ip[4];

drivers/scsi/qedi/qedi_gbl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,6 @@ void qedi_remove_sysfs_ctx_attr(struct qedi_ctx *qedi);
7373
void qedi_clearsq(struct qedi_ctx *qedi,
7474
struct qedi_conn *qedi_conn,
7575
struct iscsi_task *task);
76+
void qedi_clear_session_ctx(struct iscsi_cls_session *cls_sess);
7677

7778
#endif

drivers/scsi/qedi/qedi_iscsi.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ static int qedi_conn_bind(struct iscsi_cls_session *cls_session,
392392

393393
qedi_ep->conn = qedi_conn;
394394
qedi_conn->ep = qedi_ep;
395+
qedi_conn->iscsi_ep = ep;
395396
qedi_conn->iscsi_conn_id = qedi_ep->iscsi_cid;
396397
qedi_conn->fw_cid = qedi_ep->fw_cid;
397398
qedi_conn->cmd_cleanup_req = 0;
@@ -782,6 +783,9 @@ static int qedi_task_xmit(struct iscsi_task *task)
782783
struct qedi_cmd *cmd = task->dd_data;
783784
struct scsi_cmnd *sc = task->sc;
784785

786+
if (test_bit(QEDI_IN_SHUTDOWN, &qedi_conn->qedi->flags))
787+
return -ENODEV;
788+
785789
cmd->state = 0;
786790
cmd->task = NULL;
787791
cmd->use_slowpath = false;
@@ -1596,6 +1600,20 @@ void qedi_process_iscsi_error(struct qedi_endpoint *ep,
15961600
qedi_start_conn_recovery(qedi_conn->qedi, qedi_conn);
15971601
}
15981602

1603+
void qedi_clear_session_ctx(struct iscsi_cls_session *cls_sess)
1604+
{
1605+
struct iscsi_session *session = cls_sess->dd_data;
1606+
struct iscsi_conn *conn = session->leadconn;
1607+
struct qedi_conn *qedi_conn = conn->dd_data;
1608+
1609+
if (iscsi_is_session_online(cls_sess))
1610+
qedi_ep_disconnect(qedi_conn->iscsi_ep);
1611+
1612+
qedi_conn_destroy(qedi_conn->cls_conn);
1613+
1614+
qedi_session_destroy(cls_sess);
1615+
}
1616+
15991617
void qedi_process_tcp_error(struct qedi_endpoint *ep,
16001618
struct iscsi_eqe_data *data)
16011619
{

drivers/scsi/qedi/qedi_iscsi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ struct qedi_conn {
149149
struct iscsi_cls_conn *cls_conn;
150150
struct qedi_ctx *qedi;
151151
struct qedi_endpoint *ep;
152+
struct iscsi_endpoint *iscsi_ep;
152153
struct list_head active_cmd_list;
153154
spinlock_t list_lock; /* internal conn lock */
154155
u32 active_cmd_count;

drivers/scsi/qedi/qedi_main.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2344,7 +2344,11 @@ static void __qedi_remove(struct pci_dev *pdev, int mode)
23442344
struct qedi_ctx *qedi = pci_get_drvdata(pdev);
23452345
int rval;
23462346

2347-
if (mode == QEDI_MODE_NORMAL) {
2347+
if (mode == QEDI_MODE_SHUTDOWN)
2348+
iscsi_host_for_each_session(qedi->shost,
2349+
qedi_clear_session_ctx);
2350+
2351+
if (mode == QEDI_MODE_NORMAL || mode == QEDI_MODE_SHUTDOWN) {
23482352
if (qedi->tmf_thread) {
23492353
flush_workqueue(qedi->tmf_thread);
23502354
destroy_workqueue(qedi->tmf_thread);
@@ -2384,7 +2388,7 @@ static void __qedi_remove(struct pci_dev *pdev, int mode)
23842388

23852389
qedi_destroy_fp(qedi);
23862390

2387-
if (mode == QEDI_MODE_NORMAL) {
2391+
if (mode == QEDI_MODE_NORMAL || mode == QEDI_MODE_SHUTDOWN) {
23882392
qedi_release_cid_que(qedi);
23892393
qedi_cm_free_mem(qedi);
23902394
qedi_free_uio(qedi->udev);
@@ -2404,6 +2408,16 @@ static void __qedi_remove(struct pci_dev *pdev, int mode)
24042408
}
24052409
}
24062410

2411+
static void qedi_shutdown(struct pci_dev *pdev)
2412+
{
2413+
struct qedi_ctx *qedi = pci_get_drvdata(pdev);
2414+
2415+
QEDI_ERR(&qedi->dbg_ctx, "%s: Shutdown qedi\n", __func__);
2416+
if (test_and_set_bit(QEDI_IN_SHUTDOWN, &qedi->flags))
2417+
return;
2418+
__qedi_remove(pdev, QEDI_MODE_SHUTDOWN);
2419+
}
2420+
24072421
static int __qedi_probe(struct pci_dev *pdev, int mode)
24082422
{
24092423
struct qedi_ctx *qedi;
@@ -2740,6 +2754,7 @@ static struct pci_driver qedi_pci_driver = {
27402754
.id_table = qedi_pci_tbl,
27412755
.probe = qedi_probe,
27422756
.remove = qedi_remove,
2757+
.shutdown = qedi_shutdown,
27432758
};
27442759

27452760
static int __init qedi_init(void)

0 commit comments

Comments
 (0)