3237 * Kernel context.
3238 */
3239 static int
3240 ql_configure_device_d_id(ql_adapter_state_t *ha)
3241 {
3242 port_id_t d_id;
3243 ql_link_t *link;
3244 int rval;
3245 int loop;
3246 ql_tgt_t *tq;
3247 ql_dev_id_list_t *list;
3248 uint32_t list_size;
3249 uint16_t index, loop_id;
3250 ql_mbx_data_t mr;
3251 uint8_t retries = MAX_DEVICE_LOST_RETRY;
3252
3253 QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
3254
3255 list_size = sizeof (ql_dev_id_list_t) * DEVICE_LIST_ENTRIES;
3256 list = kmem_zalloc(list_size, KM_SLEEP);
3257 if (list == NULL) {
3258 rval = QL_MEMORY_ALLOC_FAILED;
3259 EL(ha, "failed, rval = %xh\n", rval);
3260 return (rval);
3261 }
3262
3263 do {
3264 /*
3265 * Get data from RISC code d_id list to init each device queue.
3266 */
3267 rval = ql_get_id_list(ha, (caddr_t)list, list_size, &mr);
3268 if (rval != QL_SUCCESS) {
3269 kmem_free(list, list_size);
3270 EL(ha, "failed, rval = %xh\n", rval);
3271 return (rval);
3272 }
3273
3274 /* Acquire adapter state lock. */
3275 ADAPTER_STATE_LOCK(ha);
3276
3277 /* Mark all queues as unusable. */
3278 for (index = 0; index < DEVICE_HEAD_LIST_SIZE; index++) {
3279 for (link = ha->dev[index].first; link != NULL;
3280 link = link->next) {
3281 tq = link->base_address;
4075 *
4076 * Returns:
4077 * ql local function return status code.
4078 *
4079 * Context:
4080 * Kernel context.
4081 */
4082 int
4083 ql_vport_control(ql_adapter_state_t *ha, uint8_t cmd)
4084 {
4085 ql_mbx_iocb_t *pkt;
4086 uint8_t bit;
4087 int rval;
4088 uint32_t pkt_size;
4089
4090 QL_PRINT_10(CE_CONT, "(%d,%d): started\n", ha->instance, ha->vp_index);
4091
4092 if (ha->vp_index != 0) {
4093 pkt_size = sizeof (ql_mbx_iocb_t);
4094 pkt = kmem_zalloc(pkt_size, KM_SLEEP);
4095 if (pkt == NULL) {
4096 EL(ha, "failed, kmem_zalloc\n");
4097 return (QL_MEMORY_ALLOC_FAILED);
4098 }
4099
4100 pkt->vpc.entry_type = VP_CONTROL_TYPE;
4101 pkt->vpc.entry_count = 1;
4102 pkt->vpc.command = cmd;
4103 pkt->vpc.vp_count = 1;
4104 bit = (uint8_t)(ha->vp_index - 1);
4105 pkt->vpc.vp_index[bit / 8] = (uint8_t)
4106 (pkt->vpc.vp_index[bit / 8] | BIT_0 << bit % 8);
4107
4108 rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
4109 if (rval == QL_SUCCESS && pkt->vpc.status != 0) {
4110 rval = QL_COMMAND_ERROR;
4111 }
4112
4113 kmem_free(pkt, pkt_size);
4114 } else {
4115 rval = QL_SUCCESS;
4116 }
4117
4118 if (rval != QL_SUCCESS) {
4131 *
4132 * Input:
4133 * ha = virtual adapter state pointer.
4134 * cmd = command.
4135 * opt = option.
4136 *
4137 * Context:
4138 * Interrupt or Kernel context, no mailbox commands allowed.
4139 */
4140 int
4141 ql_vport_modify(ql_adapter_state_t *ha, uint8_t cmd, uint8_t opt)
4142 {
4143 ql_mbx_iocb_t *pkt;
4144 int rval;
4145 uint32_t pkt_size;
4146
4147 QL_PRINT_10(CE_CONT, "(%d,%d): started\n", ha->instance, ha->vp_index);
4148
4149 pkt_size = sizeof (ql_mbx_iocb_t);
4150 pkt = kmem_zalloc(pkt_size, KM_SLEEP);
4151 if (pkt == NULL) {
4152 EL(ha, "failed, kmem_zalloc\n");
4153 return (QL_MEMORY_ALLOC_FAILED);
4154 }
4155
4156 pkt->vpm.entry_type = VP_MODIFY_TYPE;
4157 pkt->vpm.entry_count = 1;
4158 pkt->vpm.command = cmd;
4159 pkt->vpm.vp_count = 1;
4160 pkt->vpm.first_vp_index = ha->vp_index;
4161 pkt->vpm.first_options = opt;
4162 bcopy(ha->loginparams.nport_ww_name.raw_wwn, pkt->vpm.first_port_name,
4163 8);
4164 bcopy(ha->loginparams.node_ww_name.raw_wwn, pkt->vpm.first_node_name,
4165 8);
4166
4167 rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
4168 if (rval == QL_SUCCESS && pkt->vpm.status != 0) {
4169 EL(ha, "failed, ql_issue_mbx_iocb=%xh, status=%xh\n", rval,
4170 pkt->vpm.status);
4171 rval = QL_COMMAND_ERROR;
4172 }
4173
4174 kmem_free(pkt, pkt_size);
|
3237 * Kernel context.
3238 */
3239 static int
3240 ql_configure_device_d_id(ql_adapter_state_t *ha)
3241 {
3242 port_id_t d_id;
3243 ql_link_t *link;
3244 int rval;
3245 int loop;
3246 ql_tgt_t *tq;
3247 ql_dev_id_list_t *list;
3248 uint32_t list_size;
3249 uint16_t index, loop_id;
3250 ql_mbx_data_t mr;
3251 uint8_t retries = MAX_DEVICE_LOST_RETRY;
3252
3253 QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
3254
3255 list_size = sizeof (ql_dev_id_list_t) * DEVICE_LIST_ENTRIES;
3256 list = kmem_zalloc(list_size, KM_SLEEP);
3257
3258 do {
3259 /*
3260 * Get data from RISC code d_id list to init each device queue.
3261 */
3262 rval = ql_get_id_list(ha, (caddr_t)list, list_size, &mr);
3263 if (rval != QL_SUCCESS) {
3264 kmem_free(list, list_size);
3265 EL(ha, "failed, rval = %xh\n", rval);
3266 return (rval);
3267 }
3268
3269 /* Acquire adapter state lock. */
3270 ADAPTER_STATE_LOCK(ha);
3271
3272 /* Mark all queues as unusable. */
3273 for (index = 0; index < DEVICE_HEAD_LIST_SIZE; index++) {
3274 for (link = ha->dev[index].first; link != NULL;
3275 link = link->next) {
3276 tq = link->base_address;
4070 *
4071 * Returns:
4072 * ql local function return status code.
4073 *
4074 * Context:
4075 * Kernel context.
4076 */
4077 int
4078 ql_vport_control(ql_adapter_state_t *ha, uint8_t cmd)
4079 {
4080 ql_mbx_iocb_t *pkt;
4081 uint8_t bit;
4082 int rval;
4083 uint32_t pkt_size;
4084
4085 QL_PRINT_10(CE_CONT, "(%d,%d): started\n", ha->instance, ha->vp_index);
4086
4087 if (ha->vp_index != 0) {
4088 pkt_size = sizeof (ql_mbx_iocb_t);
4089 pkt = kmem_zalloc(pkt_size, KM_SLEEP);
4090
4091 pkt->vpc.entry_type = VP_CONTROL_TYPE;
4092 pkt->vpc.entry_count = 1;
4093 pkt->vpc.command = cmd;
4094 pkt->vpc.vp_count = 1;
4095 bit = (uint8_t)(ha->vp_index - 1);
4096 pkt->vpc.vp_index[bit / 8] = (uint8_t)
4097 (pkt->vpc.vp_index[bit / 8] | BIT_0 << bit % 8);
4098
4099 rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
4100 if (rval == QL_SUCCESS && pkt->vpc.status != 0) {
4101 rval = QL_COMMAND_ERROR;
4102 }
4103
4104 kmem_free(pkt, pkt_size);
4105 } else {
4106 rval = QL_SUCCESS;
4107 }
4108
4109 if (rval != QL_SUCCESS) {
4122 *
4123 * Input:
4124 * ha = virtual adapter state pointer.
4125 * cmd = command.
4126 * opt = option.
4127 *
4128 * Context:
4129 * Interrupt or Kernel context, no mailbox commands allowed.
4130 */
4131 int
4132 ql_vport_modify(ql_adapter_state_t *ha, uint8_t cmd, uint8_t opt)
4133 {
4134 ql_mbx_iocb_t *pkt;
4135 int rval;
4136 uint32_t pkt_size;
4137
4138 QL_PRINT_10(CE_CONT, "(%d,%d): started\n", ha->instance, ha->vp_index);
4139
4140 pkt_size = sizeof (ql_mbx_iocb_t);
4141 pkt = kmem_zalloc(pkt_size, KM_SLEEP);
4142
4143 pkt->vpm.entry_type = VP_MODIFY_TYPE;
4144 pkt->vpm.entry_count = 1;
4145 pkt->vpm.command = cmd;
4146 pkt->vpm.vp_count = 1;
4147 pkt->vpm.first_vp_index = ha->vp_index;
4148 pkt->vpm.first_options = opt;
4149 bcopy(ha->loginparams.nport_ww_name.raw_wwn, pkt->vpm.first_port_name,
4150 8);
4151 bcopy(ha->loginparams.node_ww_name.raw_wwn, pkt->vpm.first_node_name,
4152 8);
4153
4154 rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
4155 if (rval == QL_SUCCESS && pkt->vpm.status != 0) {
4156 EL(ha, "failed, ql_issue_mbx_iocb=%xh, status=%xh\n", rval,
4157 pkt->vpm.status);
4158 rval = QL_COMMAND_ERROR;
4159 }
4160
4161 kmem_free(pkt, pkt_size);
|