diff options
author | Sarveshwar Bandi <sarveshwarb@serverengines.com> | 2009-10-12 07:23:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-10-12 16:26:38 -0400 |
commit | fad9ab2cefd3a3b4754f49eb41e2f43ea314cdce (patch) | |
tree | 9eb3a5729fdad7fe2c1746556c0f3328e8a07ee2 /drivers/net/benet | |
parent | 3b885787ea4112eaa80945999ea0901bf742707f (diff) |
be2net: Implement ethtool get_phys_id function.
Signed-off-by: Sarveshwar Bandi <sarveshwarb@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/benet')
-rw-r--r-- | drivers/net/benet/be_cmds.c | 59 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.h | 37 | ||||
-rw-r--r-- | drivers/net/benet/be_ethtool.c | 30 |
3 files changed, 126 insertions, 0 deletions
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index 89876ade5e33..25b6602e464c 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
@@ -1118,6 +1118,65 @@ int be_cmd_reset_function(struct be_adapter *adapter) | |||
1118 | return status; | 1118 | return status; |
1119 | } | 1119 | } |
1120 | 1120 | ||
1121 | /* Uses sync mcc */ | ||
1122 | int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num, | ||
1123 | u8 bcn, u8 sts, u8 state) | ||
1124 | { | ||
1125 | struct be_mcc_wrb *wrb; | ||
1126 | struct be_cmd_req_enable_disable_beacon *req; | ||
1127 | int status; | ||
1128 | |||
1129 | spin_lock_bh(&adapter->mcc_lock); | ||
1130 | |||
1131 | wrb = wrb_from_mccq(adapter); | ||
1132 | req = embedded_payload(wrb); | ||
1133 | |||
1134 | be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); | ||
1135 | |||
1136 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | ||
1137 | OPCODE_COMMON_ENABLE_DISABLE_BEACON, sizeof(*req)); | ||
1138 | |||
1139 | req->port_num = port_num; | ||
1140 | req->beacon_state = state; | ||
1141 | req->beacon_duration = bcn; | ||
1142 | req->status_duration = sts; | ||
1143 | |||
1144 | status = be_mcc_notify_wait(adapter); | ||
1145 | |||
1146 | spin_unlock_bh(&adapter->mcc_lock); | ||
1147 | return status; | ||
1148 | } | ||
1149 | |||
1150 | /* Uses sync mcc */ | ||
1151 | int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state) | ||
1152 | { | ||
1153 | struct be_mcc_wrb *wrb; | ||
1154 | struct be_cmd_req_get_beacon_state *req; | ||
1155 | int status; | ||
1156 | |||
1157 | spin_lock_bh(&adapter->mcc_lock); | ||
1158 | |||
1159 | wrb = wrb_from_mccq(adapter); | ||
1160 | req = embedded_payload(wrb); | ||
1161 | |||
1162 | be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); | ||
1163 | |||
1164 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | ||
1165 | OPCODE_COMMON_GET_BEACON_STATE, sizeof(*req)); | ||
1166 | |||
1167 | req->port_num = port_num; | ||
1168 | |||
1169 | status = be_mcc_notify_wait(adapter); | ||
1170 | if (!status) { | ||
1171 | struct be_cmd_resp_get_beacon_state *resp = | ||
1172 | embedded_payload(wrb); | ||
1173 | *state = resp->beacon_state; | ||
1174 | } | ||
1175 | |||
1176 | spin_unlock_bh(&adapter->mcc_lock); | ||
1177 | return status; | ||
1178 | } | ||
1179 | |||
1121 | int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd, | 1180 | int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd, |
1122 | u32 flash_type, u32 flash_opcode, u32 buf_size) | 1181 | u32 flash_type, u32 flash_opcode, u32 buf_size) |
1123 | { | 1182 | { |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index a86f917f85f4..a1e78cc3e171 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
@@ -138,6 +138,8 @@ struct be_mcc_mailbox { | |||
138 | #define OPCODE_COMMON_NTWK_PMAC_ADD 59 | 138 | #define OPCODE_COMMON_NTWK_PMAC_ADD 59 |
139 | #define OPCODE_COMMON_NTWK_PMAC_DEL 60 | 139 | #define OPCODE_COMMON_NTWK_PMAC_DEL 60 |
140 | #define OPCODE_COMMON_FUNCTION_RESET 61 | 140 | #define OPCODE_COMMON_FUNCTION_RESET 61 |
141 | #define OPCODE_COMMON_ENABLE_DISABLE_BEACON 69 | ||
142 | #define OPCODE_COMMON_GET_BEACON_STATE 70 | ||
141 | 143 | ||
142 | #define OPCODE_ETH_ACPI_CONFIG 2 | 144 | #define OPCODE_ETH_ACPI_CONFIG 2 |
143 | #define OPCODE_ETH_PROMISCUOUS 3 | 145 | #define OPCODE_ETH_PROMISCUOUS 3 |
@@ -699,6 +701,37 @@ struct be_cmd_resp_query_fw_cfg { | |||
699 | u32 rsvd[26]; | 701 | u32 rsvd[26]; |
700 | }; | 702 | }; |
701 | 703 | ||
704 | /******************** Port Beacon ***************************/ | ||
705 | |||
706 | #define BEACON_STATE_ENABLED 0x1 | ||
707 | #define BEACON_STATE_DISABLED 0x0 | ||
708 | |||
709 | struct be_cmd_req_enable_disable_beacon { | ||
710 | struct be_cmd_req_hdr hdr; | ||
711 | u8 port_num; | ||
712 | u8 beacon_state; | ||
713 | u8 beacon_duration; | ||
714 | u8 status_duration; | ||
715 | } __packed; | ||
716 | |||
717 | struct be_cmd_resp_enable_disable_beacon { | ||
718 | struct be_cmd_resp_hdr resp_hdr; | ||
719 | u32 rsvd0; | ||
720 | } __packed; | ||
721 | |||
722 | struct be_cmd_req_get_beacon_state { | ||
723 | struct be_cmd_req_hdr hdr; | ||
724 | u8 port_num; | ||
725 | u8 rsvd0; | ||
726 | u16 rsvd1; | ||
727 | } __packed; | ||
728 | |||
729 | struct be_cmd_resp_get_beacon_state { | ||
730 | struct be_cmd_resp_hdr resp_hdr; | ||
731 | u8 beacon_state; | ||
732 | u8 rsvd0[3]; | ||
733 | } __packed; | ||
734 | |||
702 | /****************** Firmware Flash ******************/ | 735 | /****************** Firmware Flash ******************/ |
703 | struct flashrom_params { | 736 | struct flashrom_params { |
704 | u32 op_code; | 737 | u32 op_code; |
@@ -764,6 +797,10 @@ extern int be_cmd_query_fw_cfg(struct be_adapter *adapter, | |||
764 | u32 *port_num, u32 *cap); | 797 | u32 *port_num, u32 *cap); |
765 | extern int be_cmd_reset_function(struct be_adapter *adapter); | 798 | extern int be_cmd_reset_function(struct be_adapter *adapter); |
766 | extern int be_process_mcc(struct be_adapter *adapter); | 799 | extern int be_process_mcc(struct be_adapter *adapter); |
800 | extern int be_cmd_set_beacon_state(struct be_adapter *adapter, | ||
801 | u8 port_num, u8 beacon, u8 status, u8 state); | ||
802 | extern int be_cmd_get_beacon_state(struct be_adapter *adapter, | ||
803 | u8 port_num, u32 *state); | ||
767 | extern int be_cmd_write_flashrom(struct be_adapter *adapter, | 804 | extern int be_cmd_write_flashrom(struct be_adapter *adapter, |
768 | struct be_dma_mem *cmd, u32 flash_oper, | 805 | struct be_dma_mem *cmd, u32 flash_oper, |
769 | u32 flash_opcode, u32 buf_size); | 806 | u32 flash_opcode, u32 buf_size); |
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index 333729bd6d92..280471e18695 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c | |||
@@ -338,6 +338,35 @@ be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd) | |||
338 | } | 338 | } |
339 | 339 | ||
340 | static int | 340 | static int |
341 | be_phys_id(struct net_device *netdev, u32 data) | ||
342 | { | ||
343 | struct be_adapter *adapter = netdev_priv(netdev); | ||
344 | int status; | ||
345 | u32 cur; | ||
346 | |||
347 | if (!netif_running(netdev)) | ||
348 | return 0; | ||
349 | |||
350 | be_cmd_get_beacon_state(adapter, adapter->port_num, &cur); | ||
351 | |||
352 | if (cur == BEACON_STATE_ENABLED) | ||
353 | return 0; | ||
354 | |||
355 | if (data < 2) | ||
356 | data = 2; | ||
357 | |||
358 | status = be_cmd_set_beacon_state(adapter, adapter->port_num, 0, 0, | ||
359 | BEACON_STATE_ENABLED); | ||
360 | set_current_state(TASK_INTERRUPTIBLE); | ||
361 | schedule_timeout(data*HZ); | ||
362 | |||
363 | status = be_cmd_set_beacon_state(adapter, adapter->port_num, 0, 0, | ||
364 | BEACON_STATE_DISABLED); | ||
365 | |||
366 | return status; | ||
367 | } | ||
368 | |||
369 | static int | ||
341 | be_do_flash(struct net_device *netdev, struct ethtool_flash *efl) | 370 | be_do_flash(struct net_device *netdev, struct ethtool_flash *efl) |
342 | { | 371 | { |
343 | struct be_adapter *adapter = netdev_priv(netdev); | 372 | struct be_adapter *adapter = netdev_priv(netdev); |
@@ -369,6 +398,7 @@ const struct ethtool_ops be_ethtool_ops = { | |||
369 | .get_tso = ethtool_op_get_tso, | 398 | .get_tso = ethtool_op_get_tso, |
370 | .set_tso = ethtool_op_set_tso, | 399 | .set_tso = ethtool_op_set_tso, |
371 | .get_strings = be_get_stat_strings, | 400 | .get_strings = be_get_stat_strings, |
401 | .phys_id = be_phys_id, | ||
372 | .get_sset_count = be_get_sset_count, | 402 | .get_sset_count = be_get_sset_count, |
373 | .get_ethtool_stats = be_get_ethtool_stats, | 403 | .get_ethtool_stats = be_get_ethtool_stats, |
374 | .flash_device = be_do_flash, | 404 | .flash_device = be_do_flash, |