diff options
author | Somnath Kotur <somnath.kotur@emulex.com> | 2011-09-30 11:25:05 +0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-10-03 20:17:32 +0400 |
commit | 3de09455cfcde1898fb435ad425b9ad5d13ed362 (patch) | |
tree | 3cbe9378ce76b2f507fc7635301f7a60349c06b6 /drivers/net/ethernet/emulex | |
parent | 5a56eb10babbcd7b3796dc3c28c271260aa3608d (diff) | |
download | linux-3de09455cfcde1898fb435ad425b9ad5d13ed362.tar.xz |
be2net: Making die temperature ioctl call async
Also changing it's frequency to once every 64s instead of existing 32s as
it was shown to affect performance
Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 40 |
2 files changed, 30 insertions, 15 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 894f1a91d9c9..644e8fed8364 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h @@ -137,6 +137,11 @@ static inline void *queue_tail_node(struct be_queue_info *q) return q->dma_mem.va + q->tail * q->entry_size; } +static inline void *queue_index_node(struct be_queue_info *q, u16 index) +{ + return q->dma_mem.va + index * q->entry_size; +} + static inline void queue_head_inc(struct be_queue_info *q) { index_inc(&q->head, q->len); diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 1ac031e21699..6e7b5218c784 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c @@ -19,7 +19,12 @@ #include "be_cmds.h" /* Must be a power of 2 or else MODULO will BUG_ON */ -static int be_get_temp_freq = 32; +static int be_get_temp_freq = 64; + +static inline void *embedded_payload(struct be_mcc_wrb *wrb) +{ + return wrb->payload.embedded_payload; +} static void be_mcc_notify(struct be_adapter *adapter) { @@ -85,7 +90,20 @@ static int be_mcc_compl_process(struct be_adapter *adapter, be_parse_stats(adapter); adapter->stats_cmd_sent = false; } + if (compl->tag0 == + OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES) { + struct be_mcc_wrb *mcc_wrb = + queue_index_node(&adapter->mcc_obj.q, + compl->tag1); + struct be_cmd_resp_get_cntl_addnl_attribs *resp = + embedded_payload(mcc_wrb); + adapter->drv_stats.be_on_die_temperature = + resp->on_die_temperature; + } } else { + if (compl->tag0 == OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES) + be_get_temp_freq = 0; + if (compl_status == MCC_STATUS_NOT_SUPPORTED || compl_status == MCC_STATUS_ILLEGAL_REQUEST) goto done; @@ -404,10 +422,6 @@ int be_cmd_POST(struct be_adapter *adapter) return -1; } -static inline void *embedded_payload(struct be_mcc_wrb *wrb) -{ - return wrb->payload.embedded_payload; -} static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb) { @@ -1301,10 +1315,13 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter) { struct be_mcc_wrb *wrb; struct be_cmd_req_get_cntl_addnl_attribs *req; + u16 mccq_index; int status; spin_lock_bh(&adapter->mcc_lock); + mccq_index = adapter->mcc_obj.q.head; + wrb = wrb_from_mccq(adapter); if (!wrb) { status = -EBUSY; @@ -1318,16 +1335,9 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter) be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES, sizeof(*req)); - status = be_mcc_notify_wait(adapter); - if (!status) { - struct be_cmd_resp_get_cntl_addnl_attribs *resp = - embedded_payload(wrb); - adapter->drv_stats.be_on_die_temperature = - resp->on_die_temperature; - } - /* If IOCTL fails once, do not bother issuing it again */ - else - be_get_temp_freq = 0; + wrb->tag1 = mccq_index; + + be_mcc_notify(adapter); err: spin_unlock_bh(&adapter->mcc_lock); |