diff options
author | Barak Witkowski <barak@broadcom.com> | 2012-06-25 21:31:19 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-27 04:20:13 -0400 |
commit | 2e499d3cc13365a87815266dda59904dcb8c8d6c (patch) | |
tree | b9f0e8b8a4356d8beb112cf76b0b97789eb335c3 /drivers/scsi/bnx2i/bnx2i_hwi.c | |
parent | 747cf6ed3dbf6200af761f5384893c3b621a484c (diff) |
bnx2x, bnx2fc, bnx2i, cnic: Add statistics support and FCoE capabilities advertisement
1. When FCoE offload driver is registered, copy its capabilities to the chip
scratchpad.
2. Copy FCoE/iSCSI MAC addresses in aligned manner to chip scratchpad.
3. Add FCoE/iSCSI statistics collection support
Signed-off-by: Barak Witkowski <barak@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: Eddie Wai <eddie.wai@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/scsi/bnx2i/bnx2i_hwi.c')
-rw-r--r-- | drivers/scsi/bnx2i/bnx2i_hwi.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c index ece47e502282..49e8b056ca10 100644 --- a/drivers/scsi/bnx2i/bnx2i_hwi.c +++ b/drivers/scsi/bnx2i/bnx2i_hwi.c | |||
@@ -1350,6 +1350,7 @@ int bnx2i_process_scsi_cmd_resp(struct iscsi_session *session, | |||
1350 | struct cqe *cqe) | 1350 | struct cqe *cqe) |
1351 | { | 1351 | { |
1352 | struct iscsi_conn *conn = bnx2i_conn->cls_conn->dd_data; | 1352 | struct iscsi_conn *conn = bnx2i_conn->cls_conn->dd_data; |
1353 | struct bnx2i_hba *hba = bnx2i_conn->hba; | ||
1353 | struct bnx2i_cmd_response *resp_cqe; | 1354 | struct bnx2i_cmd_response *resp_cqe; |
1354 | struct bnx2i_cmd *bnx2i_cmd; | 1355 | struct bnx2i_cmd *bnx2i_cmd; |
1355 | struct iscsi_task *task; | 1356 | struct iscsi_task *task; |
@@ -1367,16 +1368,26 @@ int bnx2i_process_scsi_cmd_resp(struct iscsi_session *session, | |||
1367 | 1368 | ||
1368 | if (bnx2i_cmd->req.op_attr & ISCSI_CMD_REQUEST_READ) { | 1369 | if (bnx2i_cmd->req.op_attr & ISCSI_CMD_REQUEST_READ) { |
1369 | conn->datain_pdus_cnt += | 1370 | conn->datain_pdus_cnt += |
1370 | resp_cqe->task_stat.read_stat.num_data_outs; | 1371 | resp_cqe->task_stat.read_stat.num_data_ins; |
1371 | conn->rxdata_octets += | 1372 | conn->rxdata_octets += |
1372 | bnx2i_cmd->req.total_data_transfer_length; | 1373 | bnx2i_cmd->req.total_data_transfer_length; |
1374 | ADD_STATS_64(hba, rx_pdus, | ||
1375 | resp_cqe->task_stat.read_stat.num_data_ins); | ||
1376 | ADD_STATS_64(hba, rx_bytes, | ||
1377 | bnx2i_cmd->req.total_data_transfer_length); | ||
1373 | } else { | 1378 | } else { |
1374 | conn->dataout_pdus_cnt += | 1379 | conn->dataout_pdus_cnt += |
1375 | resp_cqe->task_stat.read_stat.num_data_outs; | 1380 | resp_cqe->task_stat.write_stat.num_data_outs; |
1376 | conn->r2t_pdus_cnt += | 1381 | conn->r2t_pdus_cnt += |
1377 | resp_cqe->task_stat.read_stat.num_r2ts; | 1382 | resp_cqe->task_stat.write_stat.num_r2ts; |
1378 | conn->txdata_octets += | 1383 | conn->txdata_octets += |
1379 | bnx2i_cmd->req.total_data_transfer_length; | 1384 | bnx2i_cmd->req.total_data_transfer_length; |
1385 | ADD_STATS_64(hba, tx_pdus, | ||
1386 | resp_cqe->task_stat.write_stat.num_data_outs); | ||
1387 | ADD_STATS_64(hba, tx_bytes, | ||
1388 | bnx2i_cmd->req.total_data_transfer_length); | ||
1389 | ADD_STATS_64(hba, rx_pdus, | ||
1390 | resp_cqe->task_stat.write_stat.num_r2ts); | ||
1380 | } | 1391 | } |
1381 | bnx2i_iscsi_unmap_sg_list(bnx2i_cmd); | 1392 | bnx2i_iscsi_unmap_sg_list(bnx2i_cmd); |
1382 | 1393 | ||
@@ -1961,6 +1972,7 @@ static int bnx2i_process_new_cqes(struct bnx2i_conn *bnx2i_conn) | |||
1961 | { | 1972 | { |
1962 | struct iscsi_conn *conn = bnx2i_conn->cls_conn->dd_data; | 1973 | struct iscsi_conn *conn = bnx2i_conn->cls_conn->dd_data; |
1963 | struct iscsi_session *session = conn->session; | 1974 | struct iscsi_session *session = conn->session; |
1975 | struct bnx2i_hba *hba = bnx2i_conn->hba; | ||
1964 | struct qp_info *qp; | 1976 | struct qp_info *qp; |
1965 | struct bnx2i_nop_in_msg *nopin; | 1977 | struct bnx2i_nop_in_msg *nopin; |
1966 | int tgt_async_msg; | 1978 | int tgt_async_msg; |
@@ -1973,7 +1985,7 @@ static int bnx2i_process_new_cqes(struct bnx2i_conn *bnx2i_conn) | |||
1973 | 1985 | ||
1974 | if (!qp->cq_virt) { | 1986 | if (!qp->cq_virt) { |
1975 | printk(KERN_ALERT "bnx2i (%s): cq resr freed in bh execution!", | 1987 | printk(KERN_ALERT "bnx2i (%s): cq resr freed in bh execution!", |
1976 | bnx2i_conn->hba->netdev->name); | 1988 | hba->netdev->name); |
1977 | goto out; | 1989 | goto out; |
1978 | } | 1990 | } |
1979 | while (1) { | 1991 | while (1) { |
@@ -1985,9 +1997,9 @@ static int bnx2i_process_new_cqes(struct bnx2i_conn *bnx2i_conn) | |||
1985 | if (nopin->op_code == ISCSI_OP_NOOP_IN && | 1997 | if (nopin->op_code == ISCSI_OP_NOOP_IN && |
1986 | nopin->itt == (u16) RESERVED_ITT) { | 1998 | nopin->itt == (u16) RESERVED_ITT) { |
1987 | printk(KERN_ALERT "bnx2i: Unsolicited " | 1999 | printk(KERN_ALERT "bnx2i: Unsolicited " |
1988 | "NOP-In detected for suspended " | 2000 | "NOP-In detected for suspended " |
1989 | "connection dev=%s!\n", | 2001 | "connection dev=%s!\n", |
1990 | bnx2i_conn->hba->netdev->name); | 2002 | hba->netdev->name); |
1991 | bnx2i_unsol_pdu_adjust_rq(bnx2i_conn); | 2003 | bnx2i_unsol_pdu_adjust_rq(bnx2i_conn); |
1992 | goto cqe_out; | 2004 | goto cqe_out; |
1993 | } | 2005 | } |
@@ -2001,7 +2013,7 @@ static int bnx2i_process_new_cqes(struct bnx2i_conn *bnx2i_conn) | |||
2001 | /* Run the kthread engine only for data cmds | 2013 | /* Run the kthread engine only for data cmds |
2002 | All other cmds will be completed in this bh! */ | 2014 | All other cmds will be completed in this bh! */ |
2003 | bnx2i_queue_scsi_cmd_resp(session, bnx2i_conn, nopin); | 2015 | bnx2i_queue_scsi_cmd_resp(session, bnx2i_conn, nopin); |
2004 | break; | 2016 | goto done; |
2005 | case ISCSI_OP_LOGIN_RSP: | 2017 | case ISCSI_OP_LOGIN_RSP: |
2006 | bnx2i_process_login_resp(session, bnx2i_conn, | 2018 | bnx2i_process_login_resp(session, bnx2i_conn, |
2007 | qp->cq_cons_qe); | 2019 | qp->cq_cons_qe); |
@@ -2044,11 +2056,15 @@ static int bnx2i_process_new_cqes(struct bnx2i_conn *bnx2i_conn) | |||
2044 | printk(KERN_ALERT "bnx2i: unknown opcode 0x%x\n", | 2056 | printk(KERN_ALERT "bnx2i: unknown opcode 0x%x\n", |
2045 | nopin->op_code); | 2057 | nopin->op_code); |
2046 | } | 2058 | } |
2059 | |||
2060 | ADD_STATS_64(hba, rx_pdus, 1); | ||
2061 | ADD_STATS_64(hba, rx_bytes, nopin->data_length); | ||
2062 | done: | ||
2047 | if (!tgt_async_msg) { | 2063 | if (!tgt_async_msg) { |
2048 | if (!atomic_read(&bnx2i_conn->ep->num_active_cmds)) | 2064 | if (!atomic_read(&bnx2i_conn->ep->num_active_cmds)) |
2049 | printk(KERN_ALERT "bnx2i (%s): no active cmd! " | 2065 | printk(KERN_ALERT "bnx2i (%s): no active cmd! " |
2050 | "op 0x%x\n", | 2066 | "op 0x%x\n", |
2051 | bnx2i_conn->hba->netdev->name, | 2067 | hba->netdev->name, |
2052 | nopin->op_code); | 2068 | nopin->op_code); |
2053 | else | 2069 | else |
2054 | atomic_dec(&bnx2i_conn->ep->num_active_cmds); | 2070 | atomic_dec(&bnx2i_conn->ep->num_active_cmds); |
@@ -2692,6 +2708,7 @@ struct cnic_ulp_ops bnx2i_cnic_cb = { | |||
2692 | .cm_remote_close = bnx2i_cm_remote_close, | 2708 | .cm_remote_close = bnx2i_cm_remote_close, |
2693 | .cm_remote_abort = bnx2i_cm_remote_abort, | 2709 | .cm_remote_abort = bnx2i_cm_remote_abort, |
2694 | .iscsi_nl_send_msg = bnx2i_send_nl_mesg, | 2710 | .iscsi_nl_send_msg = bnx2i_send_nl_mesg, |
2711 | .cnic_get_stats = bnx2i_get_stats, | ||
2695 | .owner = THIS_MODULE | 2712 | .owner = THIS_MODULE |
2696 | }; | 2713 | }; |
2697 | 2714 | ||