Commit 1e34e307 authored by Ron Mercer's avatar Ron Mercer Committed by David S. Miller

qlge: Add firmware/driver sub-command support.

These sub-commands are issued by another (FCoE) function requesting
an operation on a shared resource.
Signed-off-by: default avatarRon Mercer <ron.mercer@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 32a5b2a0
...@@ -816,6 +816,18 @@ enum { ...@@ -816,6 +816,18 @@ enum {
MB_CMD_GET_MGMNT_TFK_CTL = 0x00000161, /* Get Mgmnt Traffic Control */ MB_CMD_GET_MGMNT_TFK_CTL = 0x00000161, /* Get Mgmnt Traffic Control */
MB_GET_MPI_TFK_STOPPED = (1 << 0), MB_GET_MPI_TFK_STOPPED = (1 << 0),
MB_GET_MPI_TFK_FIFO_EMPTY = (1 << 1), MB_GET_MPI_TFK_FIFO_EMPTY = (1 << 1),
/* Sub-commands for IDC request.
* This describes the reason for the
* IDC request.
*/
MB_CMD_IOP_NONE = 0x0000,
MB_CMD_IOP_PREP_UPDATE_MPI = 0x0001,
MB_CMD_IOP_COMP_UPDATE_MPI = 0x0002,
MB_CMD_IOP_PREP_LINK_DOWN = 0x0010,
MB_CMD_IOP_DVR_START = 0x0100,
MB_CMD_IOP_FLASH_ACC = 0x0101,
MB_CMD_IOP_RESTART_MPI = 0x0102,
MB_CMD_IOP_CORE_DUMP_MPI = 0x0103,
/* Mailbox Command Status. */ /* Mailbox Command Status. */
MB_CMD_STS_GOOD = 0x00004000, /* Success. */ MB_CMD_STS_GOOD = 0x00004000, /* Success. */
......
...@@ -1038,8 +1038,11 @@ void ql_mpi_idc_work(struct work_struct *work) ...@@ -1038,8 +1038,11 @@ void ql_mpi_idc_work(struct work_struct *work)
int status; int status;
struct mbox_params *mbcp = &qdev->idc_mbc; struct mbox_params *mbcp = &qdev->idc_mbc;
u32 aen; u32 aen;
int timeout;
rtnl_lock();
aen = mbcp->mbox_out[1] >> 16; aen = mbcp->mbox_out[1] >> 16;
timeout = (mbcp->mbox_out[1] >> 8) & 0xf;
switch (aen) { switch (aen) {
default: default:
...@@ -1047,22 +1050,61 @@ void ql_mpi_idc_work(struct work_struct *work) ...@@ -1047,22 +1050,61 @@ void ql_mpi_idc_work(struct work_struct *work)
"Bug: Unhandled IDC action.\n"); "Bug: Unhandled IDC action.\n");
break; break;
case MB_CMD_PORT_RESET: case MB_CMD_PORT_RESET:
case MB_CMD_SET_PORT_CFG:
case MB_CMD_STOP_FW: case MB_CMD_STOP_FW:
ql_link_off(qdev); ql_link_off(qdev);
case MB_CMD_SET_PORT_CFG:
/* Signal the resulting link up AEN /* Signal the resulting link up AEN
* that the frame routing and mac addr * that the frame routing and mac addr
* needs to be set. * needs to be set.
* */ * */
set_bit(QL_CAM_RT_SET, &qdev->flags); set_bit(QL_CAM_RT_SET, &qdev->flags);
rtnl_lock(); /* Do ACK if required */
status = ql_mb_idc_ack(qdev); if (timeout) {
rtnl_unlock(); status = ql_mb_idc_ack(qdev);
if (status) { if (status)
QPRINTK(qdev, DRV, ERR, QPRINTK(qdev, DRV, ERR,
"Bug: No pending IDC!\n"); "Bug: No pending IDC!\n");
} else {
QPRINTK(qdev, DRV, DEBUG,
"IDC ACK not required\n");
status = 0; /* success */
}
break;
/* These sub-commands issued by another (FCoE)
* function are requesting to do an operation
* on the shared resource (MPI environment).
* We currently don't issue these so we just
* ACK the request.
*/
case MB_CMD_IOP_RESTART_MPI:
case MB_CMD_IOP_PREP_LINK_DOWN:
/* Drop the link, reload the routing
* table when link comes up.
*/
ql_link_off(qdev);
set_bit(QL_CAM_RT_SET, &qdev->flags);
/* Fall through. */
case MB_CMD_IOP_DVR_START:
case MB_CMD_IOP_FLASH_ACC:
case MB_CMD_IOP_CORE_DUMP_MPI:
case MB_CMD_IOP_PREP_UPDATE_MPI:
case MB_CMD_IOP_COMP_UPDATE_MPI:
case MB_CMD_IOP_NONE: /* an IDC without params */
/* Do ACK if required */
if (timeout) {
status = ql_mb_idc_ack(qdev);
if (status)
QPRINTK(qdev, DRV, ERR,
"Bug: No pending IDC!\n");
} else {
QPRINTK(qdev, DRV, DEBUG,
"IDC ACK not required\n");
status = 0; /* success */
} }
break;
} }
rtnl_unlock();
} }
void ql_mpi_work(struct work_struct *work) void ql_mpi_work(struct work_struct *work)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment