/** * beiscsi_get_host_param - get the iscsi parameter * @shost: pointer to scsi_host structure * @param: parameter type identifier * @buf: buffer pointer * * returns host parameter */ int beiscsi_get_host_param(struct Scsi_Host *shost, enum iscsi_host_param param, char *buf) { struct beiscsi_hba *phba = (struct beiscsi_hba *)iscsi_host_priv(shost); struct be_cmd_resp_get_mac_addr *resp; struct be_mcc_wrb *wrb; unsigned int tag, wrb_num; int len = 0; unsigned short status, extd_status; struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q; SE_DEBUG(DBG_LVL_8, "In beiscsi_get_host_param, param= %d\n", param); switch (param) { case ISCSI_HOST_PARAM_HWADDRESS: tag = be_cmd_get_mac_addr(phba); if (!tag) { SE_DEBUG(DBG_LVL_1, "be_cmd_get_mac_addr Failed \n"); return -1; } else wait_event_interruptible(phba->ctrl.mcc_wait[tag], phba->ctrl.mcc_numtag[tag]); wrb_num = (phba->ctrl.mcc_numtag[tag] & 0x00FF0000) >> 16; extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8; status = phba->ctrl.mcc_numtag[tag] & 0x000000FF; if (status || extd_status) { SE_DEBUG(DBG_LVL_1, "be_cmd_get_mac_addr Failed" " status = %d extd_status = %d \n", status, extd_status); free_mcc_tag(&phba->ctrl, tag); return -1; } else { wrb = queue_get_wrb(mccq, wrb_num); free_mcc_tag(&phba->ctrl, tag); resp = embedded_payload(wrb); memcpy(phba->mac_address, resp->mac_address, ETH_ALEN); len = frmt_macaddr(buf, PAGE_SIZE, (const unsigned char *)phba->mac_address, ETH_ALEN); } break; default: return iscsi2_host_get_param(shost, param, buf); } return len; }
int beiscsi_get_macaddr(char *buf, struct beiscsi_hba *phba) { struct be_cmd_resp_get_mac_addr *resp; struct be_mcc_wrb *wrb; unsigned int tag, wrb_num; unsigned short status, extd_status; struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q; int rc; if (phba->read_mac_address) return sysfs_format_mac(buf, phba->mac_address, ETH_ALEN); tag = be_cmd_get_mac_addr(phba); if (!tag) { SE_DEBUG(DBG_LVL_1, "be_cmd_get_mac_addr Failed\n"); return -EBUSY; } else wait_event_interruptible(phba->ctrl.mcc_wait[tag], phba->ctrl.mcc_numtag[tag]); wrb_num = (phba->ctrl.mcc_numtag[tag] & 0x00FF0000) >> 16; extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8; status = phba->ctrl.mcc_numtag[tag] & 0x000000FF; if (status || extd_status) { SE_DEBUG(DBG_LVL_1, "Failed to get be_cmd_get_mac_addr" " status = %d extd_status = %d\n", status, extd_status); free_mcc_tag(&phba->ctrl, tag); return -EAGAIN; } wrb = queue_get_wrb(mccq, wrb_num); free_mcc_tag(&phba->ctrl, tag); resp = embedded_payload(wrb); memcpy(phba->mac_address, resp->mac_address, ETH_ALEN); rc = sysfs_format_mac(buf, phba->mac_address, ETH_ALEN); phba->read_mac_address = 1; return rc; }