Print this page
5253 kmem_alloc/kmem_zalloc won't fail with KM_SLEEP
5254 getrbuf won't fail with KM_SLEEP


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);