]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/benet/be_cmds.c
be2net: Changes to update ethtool get_settings function to return appropriate values.
[net-next-2.6.git] / drivers / net / benet / be_cmds.c
index 827d86b5e70bc4d4098b8b867439007a4dbfe2e8..cc75dd0df0d85941a7b995e520e30d5826821893 100644 (file)
@@ -834,7 +834,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
 
 /* Uses synchronous mcc */
 int be_cmd_link_status_query(struct be_adapter *adapter,
-                       bool *link_up)
+                       bool *link_up, u8 *mac_speed, u16 *link_speed)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_link_status *req;
@@ -855,8 +855,11 @@ int be_cmd_link_status_query(struct be_adapter *adapter,
        status = be_mcc_notify_wait(adapter);
        if (!status) {
                struct be_cmd_resp_link_status *resp = embedded_payload(wrb);
-               if (resp->mac_speed != PHY_LINK_SPEED_ZERO)
+               if (resp->mac_speed != PHY_LINK_SPEED_ZERO) {
                        *link_up = true;
+                       *link_speed = le16_to_cpu(resp->link_speed);
+                       *mac_speed = resp->mac_speed;
+               }
        }
 
        spin_unlock_bh(&adapter->mcc_lock);
@@ -1188,6 +1191,36 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
        return status;
 }
 
+/* Uses sync mcc */
+int be_cmd_read_port_type(struct be_adapter *adapter, u32 port,
+                               u8 *connector)
+{
+       struct be_mcc_wrb *wrb;
+       struct be_cmd_req_port_type *req;
+       int status;
+
+       spin_lock_bh(&adapter->mcc_lock);
+
+       wrb = wrb_from_mccq(adapter);
+       req = embedded_payload(wrb);
+
+       be_wrb_hdr_prepare(wrb, sizeof(struct be_cmd_resp_port_type), true, 0);
+
+       be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+               OPCODE_COMMON_READ_TRANSRECV_DATA, sizeof(*req));
+
+       req->port = cpu_to_le32(port);
+       req->page_num = cpu_to_le32(TR_PAGE_A0);
+       status = be_mcc_notify_wait(adapter);
+       if (!status) {
+               struct be_cmd_resp_port_type *resp = embedded_payload(wrb);
+                       *connector = resp->data.connector;
+       }
+
+       spin_unlock_bh(&adapter->mcc_lock);
+       return status;
+}
+
 int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
                        u32 flash_type, u32 flash_opcode, u32 buf_size)
 {