1 /*-
2  * Copyright (c) 2018 Microsemi Corporation.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 /* $FreeBSD$ */
28 
29 #include "smartpqi_includes.h"
30 
31 /* Validate the scsi sense response code */
32 static inline boolean_t pqisrc_scsi_sense_valid(const struct sense_header_scsi *sshdr)
33 {
34 	DBG_FUNC("IN\n");
35 
36 	if (!sshdr)
37 		return false;
38 
39 	DBG_FUNC("OUT\n");
40 
41 	return (sshdr->response_code & 0x70) == 0x70;
42 }
43 
44 /* Initialize target ID pool for HBA/PDs */
45 void  pqisrc_init_targetid_pool(pqisrc_softstate_t *softs)
46 {
47 	int i, tid = PQI_MAX_PHYSICALS + PQI_MAX_LOGICALS - 1;
48 
49 	for(i = 0; i < PQI_MAX_PHYSICALS; i++) {
50 		softs->tid_pool.tid[i] = tid--;
51 	}
52 	softs->tid_pool.index = i - 1;
53 }
54 
55 int pqisrc_alloc_tid(pqisrc_softstate_t *softs)
56 {
57 	if(softs->tid_pool.index <= -1) {
58 		DBG_ERR("Target ID exhausted\n");
59 		return INVALID_ELEM;
60 	}
61 
62 	return  softs->tid_pool.tid[softs->tid_pool.index--];
63 }
64 
65 void pqisrc_free_tid(pqisrc_softstate_t *softs, int tid)
66 {
67 	if(softs->tid_pool.index >= PQI_MAX_PHYSICALS) {
68 		DBG_ERR("Target ID queue is full\n");
69 		return;
70 	}
71 
72 	softs->tid_pool.index++;
73 	softs->tid_pool.tid[softs->tid_pool.index] = tid;
74 }
75 
76 /* Update scsi sense info to a local buffer*/
77 boolean_t pqisrc_update_scsi_sense(const uint8_t *buff, int len,
78 			      struct sense_header_scsi *header)
79 {
80 
81 	DBG_FUNC("IN\n");
82 
83 	if (!buff || !len)
84 		return false;
85 
86 	memset(header, 0, sizeof(struct sense_header_scsi));
87 
88 	header->response_code = (buff[0] & 0x7f);
89 
90 	if (!pqisrc_scsi_sense_valid(header))
91 		return false;
92 
93 	if (header->response_code >= 0x72) {
94 		/* descriptor format */
95 		if (len > 1)
96 			header->sense_key = (buff[1] & 0xf);
97 		if (len > 2)
98 			header->asc = buff[2];
99 		if (len > 3)
100 			header->ascq = buff[3];
101 		if (len > 7)
102 			header->additional_length = buff[7];
103 	} else {
104 		 /* fixed format */
105 		if (len > 2)
106 			header->sense_key = (buff[2] & 0xf);
107 		if (len > 7) {
108 			len = (len < (buff[7] + 8)) ?
109 					len : (buff[7] + 8);
110 			if (len > 12)
111 				header->asc = buff[12];
112 			if (len > 13)
113 				header->ascq = buff[13];
114 		}
115 	}
116 
117 	DBG_FUNC("OUT\n");
118 
119 	return true;
120 }
121 
122 /*
123  * Function used to build the internal raid request and analyze the response
124  */
125 int pqisrc_build_send_raid_request(pqisrc_softstate_t *softs,  pqisrc_raid_req_t *request,
126 			    void *buff, size_t datasize, uint8_t cmd, uint16_t vpd_page, uint8_t *scsi3addr,
127 			    raid_path_error_info_elem_t *error_info)
128 {
129 
130 	uint8_t *cdb;
131 	int ret = PQI_STATUS_SUCCESS;
132 	uint32_t tag = 0;
133 	struct dma_mem device_mem;
134 	sgt_t *sgd;
135 
136 	ib_queue_t *ib_q = &softs->op_raid_ib_q[PQI_DEFAULT_IB_QUEUE];
137 	ob_queue_t *ob_q = &softs->op_ob_q[PQI_DEFAULT_IB_QUEUE];
138 
139 	rcb_t *rcb = NULL;
140 
141 	DBG_FUNC("IN\n");
142 
143 	memset(&device_mem, 0, sizeof(struct dma_mem));
144 
145 	/* for TUR datasize: 0 buff: NULL */
146 	if (datasize) {
147 		device_mem.tag = "device_mem";
148 		device_mem.size = datasize;
149 		device_mem.align = PQISRC_DEFAULT_DMA_ALIGN;
150 
151 		ret = os_dma_mem_alloc(softs, &device_mem);
152 
153 		if (ret) {
154 			DBG_ERR("failed to allocate dma memory for device_mem return code %d\n", ret);
155 			return ret;
156 		}
157 
158 		sgd = (sgt_t *)&request->sg_descriptors[0];
159 
160 		sgd->addr = device_mem.dma_addr;
161 		sgd->len = datasize;
162 		sgd->flags = SG_FLAG_LAST;
163 	}
164 
165 	/* Build raid path request */
166 	request->header.iu_type = PQI_IU_TYPE_RAID_PATH_IO_REQUEST;
167 
168 	request->header.iu_length = LE_16(offsetof(pqisrc_raid_req_t,
169 							sg_descriptors[1]) - PQI_REQUEST_HEADER_LENGTH);
170 	request->buffer_length = LE_32(datasize);
171 	memcpy(request->lun_number, scsi3addr, sizeof(request->lun_number));
172 	request->task_attribute = SOP_TASK_ATTRIBUTE_SIMPLE;
173 	request->additional_cdb_bytes_usage = PQI_ADDITIONAL_CDB_BYTES_0;
174 
175 	cdb = request->cdb;
176 
177 	switch (cmd) {
178 	case SA_INQUIRY:
179 		request->data_direction = SOP_DATA_DIR_TO_DEVICE;
180 		cdb[0] = SA_INQUIRY;
181 		if (vpd_page & VPD_PAGE) {
182 			cdb[1] = 0x1;
183 			cdb[2] = (uint8_t)vpd_page;
184 		}
185 		cdb[4] = (uint8_t)datasize;
186 		break;
187 	case SA_REPORT_LOG:
188 	case SA_REPORT_PHYS:
189 		request->data_direction = SOP_DATA_DIR_TO_DEVICE;
190 		cdb[0] = cmd;
191 		if (cmd == SA_REPORT_PHYS)
192 			cdb[1] = SA_REPORT_PHYS_EXTENDED;
193 		else
194 		cdb[1] = SA_REPORT_LOG_EXTENDED;
195 		cdb[8] = (uint8_t)((datasize) >> 8);
196 		cdb[9] = (uint8_t)datasize;
197 		break;
198 	case TEST_UNIT_READY:
199 		request->data_direction = SOP_DATA_DIR_NONE;
200 		break;
201 	case SA_GET_RAID_MAP:
202 		request->data_direction = SOP_DATA_DIR_TO_DEVICE;
203 		cdb[0] = SA_CISS_READ;
204 		cdb[1] = cmd;
205 		cdb[8] = (uint8_t)((datasize) >> 8);
206 		cdb[9] = (uint8_t)datasize;
207 		break;
208 	case SA_CACHE_FLUSH:
209 		request->data_direction = SOP_DATA_DIR_FROM_DEVICE;
210 		memcpy(device_mem.virt_addr, buff, datasize);
211 		cdb[0] = BMIC_WRITE;
212 		cdb[6] = BMIC_CACHE_FLUSH;
213 		cdb[7] = (uint8_t)((datasize)  << 8);
214 		cdb[8] = (uint8_t)((datasize)  >> 8);
215 		break;
216 	case BMIC_IDENTIFY_CONTROLLER:
217 	case BMIC_IDENTIFY_PHYSICAL_DEVICE:
218 		request->data_direction = SOP_DATA_DIR_TO_DEVICE;
219 		cdb[0] = BMIC_READ;
220 		cdb[6] = cmd;
221 		cdb[7] = (uint8_t)((datasize)  << 8);
222 		cdb[8] = (uint8_t)((datasize)  >> 8);
223 		break;
224 	case BMIC_WRITE_HOST_WELLNESS:
225 		request->data_direction = SOP_DATA_DIR_FROM_DEVICE;
226 		memcpy(device_mem.virt_addr, buff, datasize);
227 		cdb[0] = BMIC_WRITE;
228 		cdb[6] = cmd;
229 		cdb[7] = (uint8_t)((datasize)  << 8);
230 		cdb[8] = (uint8_t)((datasize)  >> 8);
231 		break;
232 	case BMIC_SENSE_SUBSYSTEM_INFORMATION:
233 		request->data_direction = SOP_DATA_DIR_TO_DEVICE;
234 		cdb[0] = BMIC_READ;
235 		cdb[6] = cmd;
236 		cdb[7] = (uint8_t)((datasize)  << 8);
237 		cdb[8] = (uint8_t)((datasize)  >> 8);
238 		break;
239 	default:
240 		DBG_ERR("unknown command 0x%x", cmd);
241 		break;
242 	}
243 
244 	tag = pqisrc_get_tag(&softs->taglist);
245 	if (INVALID_ELEM == tag) {
246 		DBG_ERR("Tag not available\n");
247 		ret = PQI_STATUS_FAILURE;
248 		goto err_notag;
249 	}
250 
251 	((pqisrc_raid_req_t *)request)->request_id = tag;
252 	((pqisrc_raid_req_t *)request)->error_index = ((pqisrc_raid_req_t *)request)->request_id;
253 	((pqisrc_raid_req_t *)request)->response_queue_id = ob_q->q_id;
254 	rcb = &softs->rcb[tag];
255 	rcb->success_cmp_callback = pqisrc_process_internal_raid_response_success;
256 	rcb->error_cmp_callback = pqisrc_process_internal_raid_response_error;
257 
258 	rcb->req_pending = true;
259 	rcb->tag = tag;
260 	/* Submit Command */
261 	ret = pqisrc_submit_cmnd(softs, ib_q, request);
262 
263 	if (ret != PQI_STATUS_SUCCESS) {
264 		DBG_ERR("Unable to submit command\n");
265 		goto err_out;
266 	}
267 
268 	ret = pqisrc_wait_on_condition(softs, rcb);
269 	if (ret != PQI_STATUS_SUCCESS) {
270 		DBG_ERR("Internal RAID request timed out: cmd : 0x%c\n", cmd);
271 		goto err_out;
272 	}
273 
274 	if (datasize) {
275 		if (buff) {
276 			memcpy(buff, device_mem.virt_addr, datasize);
277 		}
278 		os_dma_mem_free(softs, &device_mem);
279 	}
280 
281 	ret = rcb->status;
282 	if (ret) {
283 		if(error_info) {
284 			memcpy(error_info,
285 			       rcb->error_info,
286 			       sizeof(*error_info));
287 
288 			if (error_info->data_out_result ==
289 			    PQI_RAID_DATA_IN_OUT_UNDERFLOW) {
290 				ret = PQI_STATUS_SUCCESS;
291 			}
292 			else{
293 				DBG_DISC("Error!! Bus=%u Target=%u, Cmd=0x%x,"
294 					"Ret=%d\n", BMIC_GET_LEVEL_2_BUS(scsi3addr),
295 					BMIC_GET_LEVEL_TWO_TARGET(scsi3addr),
296 					cmd, ret);
297 				ret = PQI_STATUS_FAILURE;
298 			}
299 		}
300 	} else {
301 		if(error_info) {
302 			ret = PQI_STATUS_SUCCESS;
303 			memset(error_info, 0, sizeof(*error_info));
304 		}
305 	}
306 
307 	os_reset_rcb(rcb);
308 	pqisrc_put_tag(&softs->taglist, ((pqisrc_raid_req_t *)request)->request_id);
309 	DBG_FUNC("OUT\n");
310 	return ret;
311 
312 err_out:
313 	DBG_ERR("Error!! Bus=%u Target=%u, Cmd=0x%x, Ret=%d\n",
314 		BMIC_GET_LEVEL_2_BUS(scsi3addr), BMIC_GET_LEVEL_TWO_TARGET(scsi3addr),
315 		cmd, ret);
316 	os_reset_rcb(rcb);
317 	pqisrc_put_tag(&softs->taglist, ((pqisrc_raid_req_t *)request)->request_id);
318 err_notag:
319 	if (datasize)
320 		os_dma_mem_free(softs, &device_mem);
321 	DBG_FUNC("FAILED \n");
322 	return ret;
323 }
324 
325 /* common function used to send report physical and logical luns cmnds*/
326 static int pqisrc_report_luns(pqisrc_softstate_t *softs, uint8_t cmd,
327 	void *buff, size_t buf_len)
328 {
329 	int ret;
330 	pqisrc_raid_req_t request;
331 
332 	DBG_FUNC("IN\n");
333 
334 	memset(&request, 0, sizeof(request));
335 	ret =  pqisrc_build_send_raid_request(softs, &request, buff,
336 				buf_len, cmd, 0, (uint8_t *)RAID_CTLR_LUNID, NULL);
337 
338 	DBG_FUNC("OUT\n");
339 
340 	return ret;
341 }
342 
343 /* subroutine used to get physical and logical luns of the device */
344 static int pqisrc_get_physical_logical_luns(pqisrc_softstate_t *softs, uint8_t cmd,
345 		reportlun_data_ext_t **buff, size_t *data_length)
346 {
347 	int ret;
348 	size_t list_len;
349 	size_t data_len;
350 	size_t new_lun_list_length;
351 	reportlun_data_ext_t *lun_data;
352 	reportlun_header_t report_lun_header;
353 
354 	DBG_FUNC("IN\n");
355 
356 	ret = pqisrc_report_luns(softs, cmd, &report_lun_header,
357 		sizeof(report_lun_header));
358 
359 	if (ret) {
360 		DBG_ERR("failed return code: %d\n", ret);
361 		return ret;
362 	}
363 	list_len = BE_32(report_lun_header.list_length);
364 
365 retry:
366 	data_len = sizeof(reportlun_header_t) + list_len;
367 	*data_length = data_len;
368 
369 	lun_data = os_mem_alloc(softs, data_len);
370 
371 	if (!lun_data) {
372 		DBG_ERR("failed to allocate memory for lun_data\n");
373 		return PQI_STATUS_FAILURE;
374 	}
375 
376 	if (list_len == 0) {
377 		DBG_DISC("list_len is 0\n");
378 		memcpy(lun_data, &report_lun_header, sizeof(report_lun_header));
379 		goto out;
380 	}
381 
382 	ret = pqisrc_report_luns(softs, cmd, lun_data, data_len);
383 
384 	if (ret) {
385 		DBG_ERR("error\n");
386 		goto error;
387 	}
388 
389 	new_lun_list_length = BE_32(lun_data->header.list_length);
390 
391 	if (new_lun_list_length > list_len) {
392 		list_len = new_lun_list_length;
393 		os_mem_free(softs, (void *)lun_data, data_len);
394 		goto retry;
395 	}
396 
397 out:
398 	*buff = lun_data;
399 	DBG_FUNC("OUT\n");
400 	return 0;
401 
402 error:
403 	os_mem_free(softs, (void *)lun_data, data_len);
404 	DBG_ERR("FAILED\n");
405 	return ret;
406 }
407 
408 /*
409  * Function used to get physical and logical device list
410  */
411 static int pqisrc_get_phys_log_device_list(pqisrc_softstate_t *softs,
412 	reportlun_data_ext_t **physical_dev_list,
413 	reportlun_data_ext_t **logical_dev_list,
414 	size_t *phys_data_length,
415 	size_t *log_data_length)
416 {
417 	int ret = PQI_STATUS_SUCCESS;
418 	size_t logical_list_length;
419 	size_t logdev_data_length;
420 	size_t data_length;
421 	reportlun_data_ext_t *local_logdev_list;
422 	reportlun_data_ext_t *logdev_data;
423 	reportlun_header_t report_lun_header;
424 
425 	DBG_FUNC("IN\n");
426 
427 	ret = pqisrc_get_physical_logical_luns(softs, SA_REPORT_PHYS, physical_dev_list, phys_data_length);
428 	if (ret) {
429 		DBG_ERR("report physical LUNs failed");
430 		return ret;
431 	}
432 
433 	ret = pqisrc_get_physical_logical_luns(softs, SA_REPORT_LOG, logical_dev_list, log_data_length);
434 	if (ret) {
435 		DBG_ERR("report logical LUNs failed");
436 		return ret;
437 	}
438 
439 	logdev_data = *logical_dev_list;
440 
441 	if (logdev_data) {
442 		logical_list_length =
443 			BE_32(logdev_data->header.list_length);
444 	} else {
445 		memset(&report_lun_header, 0, sizeof(report_lun_header));
446 		logdev_data =
447 			(reportlun_data_ext_t *)&report_lun_header;
448 		logical_list_length = 0;
449 	}
450 
451 	logdev_data_length = sizeof(reportlun_header_t) +
452 		logical_list_length;
453 
454 	/* Adding LOGICAL device entry for controller */
455 	local_logdev_list = os_mem_alloc(softs,
456 					    logdev_data_length + sizeof(reportlun_ext_entry_t));
457 	if (!local_logdev_list) {
458 		data_length = *log_data_length;
459 		os_mem_free(softs, (char *)*logical_dev_list, data_length);
460 		*logical_dev_list = NULL;
461 		return PQI_STATUS_FAILURE;
462 	}
463 
464 	memcpy(local_logdev_list, logdev_data, logdev_data_length);
465 	memset((uint8_t *)local_logdev_list + logdev_data_length, 0,
466 		sizeof(reportlun_ext_entry_t));
467 	local_logdev_list->header.list_length = BE_32(logical_list_length +
468 							sizeof(reportlun_ext_entry_t));
469 	data_length = *log_data_length;
470 	os_mem_free(softs, (char *)*logical_dev_list, data_length);
471 	*log_data_length = logdev_data_length + sizeof(reportlun_ext_entry_t);
472 	*logical_dev_list = local_logdev_list;
473 
474 	DBG_FUNC("OUT\n");
475 
476 	return ret;
477 }
478 
479 /* Subroutine used to set Bus-Target-Lun for the requested device */
480 static inline void pqisrc_set_btl(pqi_scsi_dev_t *device,
481 	int bus, int target, int lun)
482 {
483 	DBG_FUNC("IN\n");
484 
485 	device->bus = bus;
486 	device->target = target;
487 	device->lun = lun;
488 
489 	DBG_FUNC("OUT\n");
490 }
491 
492 inline boolean_t pqisrc_is_external_raid_device(pqi_scsi_dev_t *device)
493 {
494 	return device->is_external_raid_device;
495 }
496 
497 static inline boolean_t pqisrc_is_external_raid_addr(uint8_t *scsi3addr)
498 {
499 	return scsi3addr[2] != 0;
500 }
501 
502 /* Function used to assign Bus-Target-Lun for the requested device */
503 static void pqisrc_assign_btl(pqi_scsi_dev_t *device)
504 {
505 	uint8_t *scsi3addr;
506 	uint32_t lunid;
507 	uint32_t bus;
508 	uint32_t target;
509 	uint32_t lun;
510 	DBG_FUNC("IN\n");
511 
512 	scsi3addr = device->scsi3addr;
513 	lunid = GET_LE32(scsi3addr);
514 
515 	if (pqisrc_is_hba_lunid(scsi3addr)) {
516 		/* The specified device is the controller. */
517 		pqisrc_set_btl(device, PQI_HBA_BUS, PQI_CTLR_INDEX, lunid & 0x3fff);
518 		device->target_lun_valid = true;
519 		return;
520 	}
521 
522 	if (pqisrc_is_logical_device(device)) {
523 		if (pqisrc_is_external_raid_device(device)) {
524 			DBG_DISC("External Raid Device!!!");
525 			bus = PQI_EXTERNAL_RAID_VOLUME_BUS;
526 			target = (lunid >> 16) & 0x3fff;
527 			lun = lunid & 0xff;
528 		} else {
529 			bus = PQI_RAID_VOLUME_BUS;
530 			lun = 0;
531 			target = lunid & 0x3fff;
532 		}
533 		pqisrc_set_btl(device, bus, target, lun);
534 		device->target_lun_valid = true;
535 		return;
536 	}
537 
538 	DBG_FUNC("OUT\n");
539 }
540 
541 /* Build and send the internal INQUIRY command to particular device */
542 static int pqisrc_send_scsi_inquiry(pqisrc_softstate_t *softs,
543 	uint8_t *scsi3addr, uint16_t vpd_page, uint8_t *buff, int buf_len)
544 {
545 	int ret = PQI_STATUS_SUCCESS;
546 	pqisrc_raid_req_t request;
547 	raid_path_error_info_elem_t error_info;
548 
549 	DBG_FUNC("IN\n");
550 
551 	memset(&request, 0, sizeof(request));
552 	ret =  pqisrc_build_send_raid_request(softs, &request, buff, buf_len,
553 								SA_INQUIRY, vpd_page, scsi3addr, &error_info);
554 
555 	DBG_FUNC("OUT\n");
556 	return ret;
557 }
558 
559 /* Function used to parse the sense information from response */
560 static void pqisrc_fetch_sense_info(const uint8_t *sense_data,
561 	unsigned sense_data_length, uint8_t *sense_key, uint8_t *asc, uint8_t *ascq)
562 {
563 	struct sense_header_scsi header;
564 
565 	DBG_FUNC("IN\n");
566 
567 	*sense_key = 0;
568 	*ascq = 0;
569 	*asc = 0;
570 
571 	if (pqisrc_update_scsi_sense(sense_data, sense_data_length, &header)) {
572 		*sense_key = header.sense_key;
573 		*asc = header.asc;
574 		*ascq = header.ascq;
575 	}
576 
577 	DBG_DISC("sense_key: %x asc: %x ascq: %x\n", *sense_key, *asc, *ascq);
578 
579 	DBG_FUNC("OUT\n");
580 }
581 
582 /* Function used to validate volume offline status */
583 static uint8_t pqisrc_get_volume_offline_status(pqisrc_softstate_t *softs,
584 	uint8_t *scsi3addr)
585 {
586 	int ret = PQI_STATUS_SUCCESS;
587 	uint8_t status = SA_LV_STATUS_VPD_UNSUPPORTED;
588 	uint8_t size;
589 	uint8_t *buff = NULL;
590 
591 	DBG_FUNC("IN\n");
592 
593 	buff = os_mem_alloc(softs, 64);
594 	if (!buff)
595 		return PQI_STATUS_FAILURE;
596 
597 	/* Get the size of the VPD return buff. */
598 	ret = pqisrc_send_scsi_inquiry(softs, scsi3addr, VPD_PAGE | SA_VPD_LV_STATUS,
599 		buff, SCSI_VPD_HEADER_LENGTH);
600 
601 	if (ret)
602 		goto out;
603 
604 	size = buff[3];
605 
606 	/* Now get the whole VPD buff. */
607 	ret = pqisrc_send_scsi_inquiry(softs, scsi3addr, VPD_PAGE | SA_VPD_LV_STATUS,
608 		buff, size + SCSI_VPD_HEADER_LENGTH);
609 	if (ret)
610 		goto out;
611 
612 	status = buff[4];
613 
614 out:
615 	os_mem_free(softs, (char *)buff, 64);
616 	DBG_FUNC("OUT\n");
617 
618 	return status;
619 }
620 
621 /* Determine offline status of a volume.  Returns appropriate SA_LV_* status.*/
622 static uint8_t pqisrc_get_dev_vol_status(pqisrc_softstate_t *softs,
623 	uint8_t *scsi3addr)
624 {
625 	int ret = PQI_STATUS_SUCCESS;
626 	uint8_t *sense_data;
627 	unsigned sense_data_len;
628 	uint8_t sense_key;
629 	uint8_t asc;
630 	uint8_t ascq;
631 	uint8_t off_status;
632 	uint8_t scsi_status;
633 	pqisrc_raid_req_t request;
634 	raid_path_error_info_elem_t error_info;
635 
636 	DBG_FUNC("IN\n");
637 
638 	memset(&request, 0, sizeof(request));
639 	ret =  pqisrc_build_send_raid_request(softs, &request, NULL, 0,
640 				TEST_UNIT_READY, 0, scsi3addr, &error_info);
641 
642 	if (ret)
643 		goto error;
644 	sense_data = error_info.data;
645 	sense_data_len = LE_16(error_info.sense_data_len);
646 
647 	if (sense_data_len > sizeof(error_info.data))
648 		sense_data_len = sizeof(error_info.data);
649 
650 	pqisrc_fetch_sense_info(sense_data, sense_data_len, &sense_key, &asc,
651 		&ascq);
652 
653 	scsi_status = error_info.status;
654 
655 	/* scsi status: "CHECK CONDN" /  SK: "not ready" ? */
656 	if (scsi_status != 2 ||
657 	    sense_key != 2 ||
658 	    asc != ASC_LUN_NOT_READY) {
659 		return SA_LV_OK;
660 	}
661 
662 	/* Determine the reason for not ready state. */
663 	off_status = pqisrc_get_volume_offline_status(softs, scsi3addr);
664 
665 	DBG_DISC("offline_status 0x%x\n", off_status);
666 
667 	/* Keep volume offline in certain cases. */
668 	switch (off_status) {
669 	case SA_LV_UNDERGOING_ERASE:
670 	case SA_LV_NOT_AVAILABLE:
671 	case SA_LV_UNDERGOING_RPI:
672 	case SA_LV_PENDING_RPI:
673 	case SA_LV_ENCRYPTED_NO_KEY:
674 	case SA_LV_PLAINTEXT_IN_ENCRYPT_ONLY_CONTROLLER:
675 	case SA_LV_UNDERGOING_ENCRYPTION:
676 	case SA_LV_UNDERGOING_ENCRYPTION_REKEYING:
677 	case SA_LV_ENCRYPTED_IN_NON_ENCRYPTED_CONTROLLER:
678 		return off_status;
679 	case SA_LV_STATUS_VPD_UNSUPPORTED:
680 		/*
681 		 * If the VPD status page isn't available,
682 		 * use ASC/ASCQ to determine state.
683 		 */
684 		if (ascq == ASCQ_LUN_NOT_READY_FORMAT_IN_PROGRESS ||
685 		    ascq == ASCQ_LUN_NOT_READY_INITIALIZING_CMD_REQ)
686 			return off_status;
687 		break;
688 	}
689 
690 	DBG_FUNC("OUT\n");
691 
692 	return SA_LV_OK;
693 
694 error:
695 	return SA_LV_STATUS_VPD_UNSUPPORTED;
696 }
697 
698 /* Validate the RAID map parameters */
699 static int pqisrc_raid_map_validation(pqisrc_softstate_t *softs,
700 	pqi_scsi_dev_t *device, pqisrc_raid_map_t *raid_map)
701 {
702 	char *error_msg;
703 	uint32_t raidmap_size;
704 	uint32_t r5or6_blocks_per_row;
705 	unsigned phys_dev_num;
706 	unsigned num_raidmap_entries;
707 
708 	DBG_FUNC("IN\n");
709 
710 	raidmap_size = LE_32(raid_map->structure_size);
711 	if (raidmap_size < offsetof(pqisrc_raid_map_t, dev_data)) {
712 		error_msg = "RAID map too small\n";
713 		goto error;
714 	}
715 
716 	if (raidmap_size > sizeof(*raid_map)) {
717 		error_msg = "RAID map too large\n";
718 		goto error;
719 	}
720 
721 	phys_dev_num = LE_16(raid_map->layout_map_count) *
722 		(LE_16(raid_map->data_disks_per_row) +
723 		LE_16(raid_map->metadata_disks_per_row));
724 	num_raidmap_entries = phys_dev_num *
725 		LE_16(raid_map->row_cnt);
726 
727 	if (num_raidmap_entries > RAID_MAP_MAX_ENTRIES) {
728 		error_msg = "invalid number of map entries in RAID map\n";
729 		goto error;
730 	}
731 
732 	if (device->raid_level == SA_RAID_1) {
733 		if (LE_16(raid_map->layout_map_count) != 2) {
734 			error_msg = "invalid RAID-1 map\n";
735 			goto error;
736 		}
737 	} else if (device->raid_level == SA_RAID_ADM) {
738 		if (LE_16(raid_map->layout_map_count) != 3) {
739 			error_msg = "invalid RAID-1(ADM) map\n";
740 			goto error;
741 		}
742 	} else if ((device->raid_level == SA_RAID_5 ||
743 		device->raid_level == SA_RAID_6) &&
744 		LE_16(raid_map->layout_map_count) > 1) {
745 		/* RAID 50/60 */
746 		r5or6_blocks_per_row =
747 			LE_16(raid_map->strip_size) *
748 			LE_16(raid_map->data_disks_per_row);
749 		if (r5or6_blocks_per_row == 0) {
750 			error_msg = "invalid RAID-5 or RAID-6 map\n";
751 			goto error;
752 		}
753 	}
754 
755 	DBG_FUNC("OUT\n");
756 
757 	return 0;
758 
759 error:
760 	DBG_ERR("%s\n", error_msg);
761 	return PQI_STATUS_FAILURE;
762 }
763 
764 /* Get device raidmap for the requested device */
765 static int pqisrc_get_device_raidmap(pqisrc_softstate_t *softs,
766 	pqi_scsi_dev_t *device)
767 {
768 	int ret = PQI_STATUS_SUCCESS;
769 	pqisrc_raid_req_t request;
770 	pqisrc_raid_map_t *raid_map;
771 
772 	DBG_FUNC("IN\n");
773 
774 	raid_map = os_mem_alloc(softs, sizeof(*raid_map));
775 	if (!raid_map)
776 		return PQI_STATUS_FAILURE;
777 
778 	memset(&request, 0, sizeof(request));
779 	ret =  pqisrc_build_send_raid_request(softs, &request, raid_map, sizeof(*raid_map),
780 			 		SA_GET_RAID_MAP, 0, device->scsi3addr, NULL);
781 
782 	if (ret) {
783 		DBG_ERR("error in build send raid req ret=%d\n", ret);
784 		goto err_out;
785 	}
786 
787 	ret = pqisrc_raid_map_validation(softs, device, raid_map);
788 	if (ret) {
789 		DBG_ERR("error in raid map validation ret=%d\n", ret);
790 		goto err_out;
791 	}
792 
793 	device->raid_map = raid_map;
794 	DBG_FUNC("OUT\n");
795 	return 0;
796 
797 err_out:
798 	os_mem_free(softs, (char*)raid_map, sizeof(*raid_map));
799 	DBG_FUNC("FAILED \n");
800 	return ret;
801 }
802 
803 /* Get device ioaccel_status to validate the type of device */
804 static void pqisrc_get_dev_ioaccel_status(pqisrc_softstate_t *softs,
805 	pqi_scsi_dev_t *device)
806 {
807 	int ret = PQI_STATUS_SUCCESS;
808 	uint8_t *buff;
809 	uint8_t ioaccel_status;
810 
811 	DBG_FUNC("IN\n");
812 
813 	buff = os_mem_alloc(softs, 64);
814 	if (!buff)
815 		return;
816 
817 	ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr,
818 					VPD_PAGE | SA_VPD_LV_IOACCEL_STATUS, buff, 64);
819 	if (ret) {
820 		DBG_ERR("error in send scsi inquiry ret=%d\n", ret);
821 		goto err_out;
822 	}
823 
824 	ioaccel_status = buff[IOACCEL_STATUS_BYTE];
825 	device->offload_config =
826 		!!(ioaccel_status & OFFLOAD_CONFIGURED_BIT);
827 
828 	if (device->offload_config) {
829 		device->offload_enabled_pending =
830 			!!(ioaccel_status & OFFLOAD_ENABLED_BIT);
831 		if (pqisrc_get_device_raidmap(softs, device))
832 			device->offload_enabled_pending = false;
833 	}
834 
835 	DBG_DISC("offload_config: 0x%x offload_enabled_pending: 0x%x \n",
836 			device->offload_config, device->offload_enabled_pending);
837 
838 err_out:
839 	os_mem_free(softs, (char*)buff, 64);
840 	DBG_FUNC("OUT\n");
841 }
842 
843 /* Get RAID level of requested device */
844 static void pqisrc_get_dev_raid_level(pqisrc_softstate_t *softs,
845 	pqi_scsi_dev_t *device)
846 {
847 	uint8_t raid_level;
848 	uint8_t *buff;
849 
850 	DBG_FUNC("IN\n");
851 
852 	raid_level = SA_RAID_UNKNOWN;
853 
854 	buff = os_mem_alloc(softs, 64);
855 	if (buff) {
856 		int ret;
857 		ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr,
858 			VPD_PAGE | SA_VPD_LV_DEVICE_GEOMETRY, buff, 64);
859 		if (ret == 0) {
860 			raid_level = buff[8];
861 			if (raid_level > SA_RAID_MAX)
862 				raid_level = SA_RAID_UNKNOWN;
863 		}
864 		os_mem_free(softs, (char*)buff, 64);
865 	}
866 
867 	device->raid_level = raid_level;
868 	DBG_DISC("RAID LEVEL: %x \n",  raid_level);
869 	DBG_FUNC("OUT\n");
870 }
871 
872 /* Parse the inquiry response and determine the type of device */
873 static int pqisrc_get_dev_data(pqisrc_softstate_t *softs,
874 	pqi_scsi_dev_t *device)
875 {
876 	int ret = PQI_STATUS_SUCCESS;
877 	uint8_t *inq_buff;
878 
879 	DBG_FUNC("IN\n");
880 
881 	inq_buff = os_mem_alloc(softs, OBDR_TAPE_INQ_SIZE);
882 	if (!inq_buff)
883 		return PQI_STATUS_FAILURE;
884 
885 	/* Send an inquiry to the device to see what it is. */
886 	ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr, 0, inq_buff,
887 		OBDR_TAPE_INQ_SIZE);
888 	if (ret)
889 		goto err_out;
890 	pqisrc_sanitize_inquiry_string(&inq_buff[8], 8);
891 	pqisrc_sanitize_inquiry_string(&inq_buff[16], 16);
892 
893 	device->devtype = inq_buff[0] & 0x1f;
894 	memcpy(device->vendor, &inq_buff[8],
895 		sizeof(device->vendor));
896 	memcpy(device->model, &inq_buff[16],
897 		sizeof(device->model));
898 	DBG_DISC("DEV_TYPE: %x VENDOR: %s MODEL: %s\n",  device->devtype, device->vendor, device->model);
899 
900 	if (pqisrc_is_logical_device(device) && device->devtype == DISK_DEVICE) {
901 		if (pqisrc_is_external_raid_device(device)) {
902 			device->raid_level = SA_RAID_UNKNOWN;
903 			device->volume_status = SA_LV_OK;
904 			device->volume_offline = false;
905 		}
906 		else {
907 			pqisrc_get_dev_raid_level(softs, device);
908 			pqisrc_get_dev_ioaccel_status(softs, device);
909 			device->volume_status = pqisrc_get_dev_vol_status(softs,
910 						device->scsi3addr);
911 			device->volume_offline = device->volume_status != SA_LV_OK;
912 		}
913 	}
914 
915 	/*
916 	 * Check if this is a One-Button-Disaster-Recovery device
917 	 * by looking for "$DR-10" at offset 43 in the inquiry data.
918 	 */
919 	device->is_obdr_device = (device->devtype == ROM_DEVICE &&
920 		memcmp(&inq_buff[OBDR_SIG_OFFSET], OBDR_TAPE_SIG,
921 			OBDR_SIG_LEN) == 0);
922 err_out:
923 	os_mem_free(softs, (char*)inq_buff, OBDR_TAPE_INQ_SIZE);
924 
925 	DBG_FUNC("OUT\n");
926 	return ret;
927 }
928 
929 /*
930  * BMIC (Basic Management And Interface Commands) command
931  * to get the controller identify params
932  */
933 static int pqisrc_identify_ctrl(pqisrc_softstate_t *softs,
934 	bmic_ident_ctrl_t *buff)
935 {
936 	int ret = PQI_STATUS_SUCCESS;
937 	pqisrc_raid_req_t request;
938 
939 	DBG_FUNC("IN\n");
940 
941 	memset(&request, 0, sizeof(request));
942 	ret =  pqisrc_build_send_raid_request(softs, &request, buff, sizeof(*buff),
943 				BMIC_IDENTIFY_CONTROLLER, 0, (uint8_t *)RAID_CTLR_LUNID, NULL);
944 	DBG_FUNC("OUT\n");
945 
946 	return ret;
947 }
948 
949 /* Get the adapter FW version using BMIC_IDENTIFY_CONTROLLER */
950 int pqisrc_get_ctrl_fw_version(pqisrc_softstate_t *softs)
951 {
952 	int ret = PQI_STATUS_SUCCESS;
953 	bmic_ident_ctrl_t *identify_ctrl;
954 
955 	DBG_FUNC("IN\n");
956 
957 	identify_ctrl = os_mem_alloc(softs, sizeof(*identify_ctrl));
958 	if (!identify_ctrl) {
959 		DBG_ERR("failed to allocate memory for identify_ctrl\n");
960 		return PQI_STATUS_FAILURE;
961 	}
962 
963 	memset(identify_ctrl, 0, sizeof(*identify_ctrl));
964 
965 	ret = pqisrc_identify_ctrl(softs, identify_ctrl);
966 	if (ret)
967 		goto out;
968 
969 	softs->fw_build_number = identify_ctrl->fw_build_number;
970 	memcpy(softs->fw_version, identify_ctrl->fw_version,
971 		sizeof(identify_ctrl->fw_version));
972 	softs->fw_version[sizeof(identify_ctrl->fw_version)] = '\0';
973 	snprintf(softs->fw_version +
974 		strlen(softs->fw_version),
975 		sizeof(softs->fw_version),
976 		"-%u", identify_ctrl->fw_build_number);
977 out:
978 	os_mem_free(softs, (char *)identify_ctrl, sizeof(*identify_ctrl));
979 	DBG_INIT("Firmware version: %s Firmware build number: %d\n", softs->fw_version, softs->fw_build_number);
980 	DBG_FUNC("OUT\n");
981 	return ret;
982 }
983 
984 /* BMIC command to determine scsi device identify params */
985 static int pqisrc_identify_physical_disk(pqisrc_softstate_t *softs,
986 	pqi_scsi_dev_t *device,
987 	bmic_ident_physdev_t *buff,
988 	int buf_len)
989 {
990 	int ret = PQI_STATUS_SUCCESS;
991 	uint16_t bmic_device_index;
992 	pqisrc_raid_req_t request;
993 
994 	DBG_FUNC("IN\n");
995 
996 	memset(&request, 0, sizeof(request));
997 	bmic_device_index = BMIC_GET_DRIVE_NUMBER(device->scsi3addr);
998 	request.cdb[2] = (uint8_t)bmic_device_index;
999 	request.cdb[9] = (uint8_t)(bmic_device_index >> 8);
1000 
1001 	ret =  pqisrc_build_send_raid_request(softs, &request, buff, buf_len,
1002 				BMIC_IDENTIFY_PHYSICAL_DEVICE, 0, (uint8_t *)RAID_CTLR_LUNID, NULL);
1003 	DBG_FUNC("OUT\n");
1004 	return ret;
1005 }
1006 
1007 /*
1008  * Function used to get the scsi device information using one of BMIC
1009  * BMIC_IDENTIFY_PHYSICAL_DEVICE
1010  */
1011 static void pqisrc_get_physical_device_info(pqisrc_softstate_t *softs,
1012 	pqi_scsi_dev_t *device,
1013 	bmic_ident_physdev_t *id_phys)
1014 {
1015 	int ret = PQI_STATUS_SUCCESS;
1016 
1017 	DBG_FUNC("IN\n");
1018 	memset(id_phys, 0, sizeof(*id_phys));
1019 
1020 	ret= pqisrc_identify_physical_disk(softs, device,
1021 		id_phys, sizeof(*id_phys));
1022 	if (ret) {
1023 		device->queue_depth = PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH;
1024 		return;
1025 	}
1026 
1027 	device->queue_depth =
1028 		LE_16(id_phys->current_queue_depth_limit);
1029 	device->device_type = id_phys->device_type;
1030 	device->active_path_index = id_phys->active_path_number;
1031 	device->path_map = id_phys->redundant_path_present_map;
1032 	memcpy(&device->box,
1033 		&id_phys->alternate_paths_phys_box_on_port,
1034 		sizeof(device->box));
1035 	memcpy(&device->phys_connector,
1036 		&id_phys->alternate_paths_phys_connector,
1037 		sizeof(device->phys_connector));
1038 	device->bay = id_phys->phys_bay_in_box;
1039 
1040 	DBG_DISC("BMIC DEV_TYPE: %x QUEUE DEPTH: 0x%x \n",  device->device_type, device->queue_depth);
1041 	DBG_FUNC("OUT\n");
1042 }
1043 
1044 /* Function used to find the entry of the device in a list */
1045 static device_status_t pqisrc_scsi_find_entry(pqisrc_softstate_t *softs,
1046 	pqi_scsi_dev_t *device_to_find,
1047 	pqi_scsi_dev_t **same_device)
1048 {
1049 	pqi_scsi_dev_t *device;
1050 	int i,j;
1051 	DBG_FUNC("IN\n");
1052 	for(i = 0; i < PQI_MAX_DEVICES; i++) {
1053 		for(j = 0; j < PQI_MAX_MULTILUN; j++) {
1054 			if(softs->device_list[i][j] == NULL)
1055 				continue;
1056 			device = softs->device_list[i][j];
1057 			if (pqisrc_scsi3addr_equal(device_to_find->scsi3addr,
1058 				device->scsi3addr)) {
1059 				*same_device = device;
1060 				if (pqisrc_device_equal(device_to_find, device)) {
1061 					if (device_to_find->volume_offline)
1062 						return DEVICE_CHANGED;
1063 					return DEVICE_UNCHANGED;
1064 				}
1065 				return DEVICE_CHANGED;
1066 			}
1067 		}
1068 	}
1069 	DBG_FUNC("OUT\n");
1070 
1071 	return DEVICE_NOT_FOUND;
1072 }
1073 
1074 /* Update the newly added devices as existed device */
1075 static void pqisrc_exist_device_update(pqisrc_softstate_t *softs,
1076 	pqi_scsi_dev_t *device_exist,
1077 	pqi_scsi_dev_t *new_device)
1078 {
1079 	DBG_FUNC("IN\n");
1080 	device_exist->expose_device = new_device->expose_device;
1081 	memcpy(device_exist->vendor, new_device->vendor,
1082 		sizeof(device_exist->vendor));
1083 	memcpy(device_exist->model, new_device->model,
1084 		sizeof(device_exist->model));
1085 	device_exist->is_physical_device = new_device->is_physical_device;
1086 	device_exist->is_external_raid_device =
1087 		new_device->is_external_raid_device;
1088 	device_exist->sas_address = new_device->sas_address;
1089 	device_exist->raid_level = new_device->raid_level;
1090 	device_exist->queue_depth = new_device->queue_depth;
1091 	device_exist->ioaccel_handle = new_device->ioaccel_handle;
1092 	device_exist->volume_status = new_device->volume_status;
1093 	device_exist->active_path_index = new_device->active_path_index;
1094 	device_exist->path_map = new_device->path_map;
1095 	device_exist->bay = new_device->bay;
1096 	memcpy(device_exist->box, new_device->box,
1097 		sizeof(device_exist->box));
1098 	memcpy(device_exist->phys_connector, new_device->phys_connector,
1099 		sizeof(device_exist->phys_connector));
1100 	device_exist->offload_config = new_device->offload_config;
1101 	device_exist->offload_enabled = false;
1102 	device_exist->offload_enabled_pending =
1103 		new_device->offload_enabled_pending;
1104 	device_exist->offload_to_mirror = 0;
1105 	if (device_exist->raid_map)
1106 		os_mem_free(softs,
1107 			    (char *)device_exist->raid_map,
1108 			    sizeof(*device_exist->raid_map));
1109 	device_exist->raid_map = new_device->raid_map;
1110 	/* To prevent this from being freed later. */
1111 	new_device->raid_map = NULL;
1112 	DBG_FUNC("OUT\n");
1113 }
1114 
1115 /* Validate the ioaccel_handle for a newly added device */
1116 static pqi_scsi_dev_t *pqisrc_identify_device_via_ioaccel(
1117 	pqisrc_softstate_t *softs, uint32_t ioaccel_handle)
1118 {
1119 	pqi_scsi_dev_t *device;
1120 	int i,j;
1121 	DBG_FUNC("IN\n");
1122 	for(i = 0; i < PQI_MAX_DEVICES; i++) {
1123 		for(j = 0; j < PQI_MAX_MULTILUN; j++) {
1124 			if(softs->device_list[i][j] == NULL)
1125 				continue;
1126 			device = softs->device_list[i][j];
1127 			if (device->devtype != DISK_DEVICE)
1128 				continue;
1129 			if (pqisrc_is_logical_device(device))
1130 				continue;
1131 			if (device->ioaccel_handle == ioaccel_handle)
1132 				return device;
1133 		}
1134 	}
1135 	DBG_FUNC("OUT\n");
1136 
1137 	return NULL;
1138 }
1139 
1140 /* Get the scsi device queue depth */
1141 static void pqisrc_update_log_dev_qdepth(pqisrc_softstate_t *softs)
1142 {
1143 	unsigned i;
1144 	unsigned phys_dev_num;
1145 	unsigned num_raidmap_entries;
1146 	unsigned queue_depth;
1147 	pqisrc_raid_map_t *raid_map;
1148 	pqi_scsi_dev_t *device;
1149 	raidmap_data_t *dev_data;
1150 	pqi_scsi_dev_t *phys_disk;
1151 	unsigned j;
1152 	unsigned k;
1153 
1154 	DBG_FUNC("IN\n");
1155 
1156 	for(i = 0; i < PQI_MAX_DEVICES; i++) {
1157 		for(j = 0; j < PQI_MAX_MULTILUN; j++) {
1158 			if(softs->device_list[i][j] == NULL)
1159 				continue;
1160 			device = softs->device_list[i][j];
1161 			if (device->devtype != DISK_DEVICE)
1162 				continue;
1163 			if (!pqisrc_is_logical_device(device))
1164 				continue;
1165 			if (pqisrc_is_external_raid_device(device))
1166 				continue;
1167 			device->queue_depth = PQI_LOGICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH;
1168 			raid_map = device->raid_map;
1169 			if (!raid_map)
1170 				return;
1171 			dev_data = raid_map->dev_data;
1172 			phys_dev_num = LE_16(raid_map->layout_map_count) *
1173 					(LE_16(raid_map->data_disks_per_row) +
1174 					LE_16(raid_map->metadata_disks_per_row));
1175 			num_raidmap_entries = phys_dev_num *
1176 						LE_16(raid_map->row_cnt);
1177 
1178 			queue_depth = 0;
1179 			for (k = 0; k < num_raidmap_entries; k++) {
1180 				phys_disk = pqisrc_identify_device_via_ioaccel(softs,
1181 						dev_data[k].ioaccel_handle);
1182 
1183 				if (!phys_disk) {
1184 					DBG_WARN(
1185 					"Failed to find physical disk handle for logical drive %016llx\n",
1186 						(unsigned long long)BE_64(device->scsi3addr[0]));
1187 					device->offload_enabled = false;
1188 					device->offload_enabled_pending = false;
1189 					if (raid_map)
1190 						os_mem_free(softs, (char *)raid_map, sizeof(*raid_map));
1191 					device->raid_map = NULL;
1192 					return;
1193 				}
1194 
1195 				queue_depth += phys_disk->queue_depth;
1196 			}
1197 
1198 			device->queue_depth = queue_depth;
1199 		} /* end inner loop */
1200 	}/* end outer loop */
1201 	DBG_FUNC("OUT\n");
1202 }
1203 
1204 /* Function used to add a scsi device to OS scsi subsystem */
1205 static int pqisrc_add_device(pqisrc_softstate_t *softs,
1206 	pqi_scsi_dev_t *device)
1207 {
1208 	DBG_FUNC("IN\n");
1209 	DBG_DISC("vendor: %s model: %s bus:%d target:%d lun:%d is_physical_device:0x%x expose_device:0x%x volume_offline 0x%x volume_status 0x%x \n",
1210 		device->vendor, device->model, device->bus, device->target, device->lun, device->is_physical_device, device->expose_device, device->volume_offline, device->volume_status);
1211 
1212 	device->invalid = false;
1213 
1214 	if(device->expose_device) {
1215 		/* TBD: Call OS upper layer function to add the device entry */
1216 		os_add_device(softs,device);
1217 	}
1218 	DBG_FUNC("OUT\n");
1219 	return PQI_STATUS_SUCCESS;
1220 
1221 }
1222 
1223 /* Function used to remove a scsi device from OS scsi subsystem */
1224 void pqisrc_remove_device(pqisrc_softstate_t *softs,
1225 	pqi_scsi_dev_t *device)
1226 {
1227 	DBG_FUNC("IN\n");
1228 	DBG_DISC("vendor: %s model: %s bus:%d target:%d lun:%d is_physical_device:0x%x expose_device:0x%x volume_offline 0x%x volume_status 0x%x \n",
1229 		device->vendor, device->model, device->bus, device->target, device->lun, device->is_physical_device, device->expose_device, device->volume_offline, device->volume_status);
1230 
1231 	/* TBD: Call OS upper layer function to remove the device entry */
1232 	device->invalid = true;
1233 	os_remove_device(softs,device);
1234 	DBG_FUNC("OUT\n");
1235 }
1236 
1237 /*
1238  * When exposing new device to OS fails then adjst list according to the
1239  * mid scsi list
1240  */
1241 static void pqisrc_adjust_list(pqisrc_softstate_t *softs,
1242 	pqi_scsi_dev_t *device)
1243 {
1244 	DBG_FUNC("IN\n");
1245 
1246 	if (!device) {
1247 		DBG_ERR("softs = %p: device is NULL !!!\n", softs);
1248 		return;
1249 	}
1250 
1251 	OS_ACQUIRE_SPINLOCK(&softs->devlist_lock);
1252 	softs->device_list[device->target][device->lun] = NULL;
1253 	OS_RELEASE_SPINLOCK(&softs->devlist_lock);
1254 	pqisrc_device_mem_free(softs, device);
1255 
1256 	DBG_FUNC("OUT\n");
1257 }
1258 
1259 /* Debug routine used to display the RAID volume status of the device */
1260 static void pqisrc_display_volume_status(pqisrc_softstate_t *softs,
1261 	pqi_scsi_dev_t *device)
1262 {
1263 	char *status;
1264 
1265 	DBG_FUNC("IN\n");
1266 	switch (device->volume_status) {
1267 	case SA_LV_OK:
1268 		status = "Volume is online.";
1269 		break;
1270 	case SA_LV_UNDERGOING_ERASE:
1271 		status = "Volume is undergoing background erase process.";
1272 		break;
1273 	case SA_LV_NOT_AVAILABLE:
1274 		status = "Volume is waiting for transforming volume.";
1275 		break;
1276 	case SA_LV_UNDERGOING_RPI:
1277 		status = "Volume is undergoing rapid parity initialization process.";
1278 		break;
1279 	case SA_LV_PENDING_RPI:
1280 		status = "Volume is queued for rapid parity initialization process.";
1281 		break;
1282 	case SA_LV_ENCRYPTED_NO_KEY:
1283 		status = "Volume is encrypted and cannot be accessed because key is not present.";
1284 		break;
1285 	case SA_LV_PLAINTEXT_IN_ENCRYPT_ONLY_CONTROLLER:
1286 		status = "Volume is not encrypted and cannot be accessed because controller is in encryption-only mode.";
1287 		break;
1288 	case SA_LV_UNDERGOING_ENCRYPTION:
1289 		status = "Volume is undergoing encryption process.";
1290 		break;
1291 	case SA_LV_UNDERGOING_ENCRYPTION_REKEYING:
1292 		status = "Volume is undergoing encryption re-keying process.";
1293 		break;
1294 	case SA_LV_ENCRYPTED_IN_NON_ENCRYPTED_CONTROLLER:
1295 		status = "Volume is encrypted and cannot be accessed because controller does not have encryption enabled.";
1296 		break;
1297 	case SA_LV_PENDING_ENCRYPTION:
1298 		status = "Volume is pending migration to encrypted state, but process has not started.";
1299 		break;
1300 	case SA_LV_PENDING_ENCRYPTION_REKEYING:
1301 		status = "Volume is encrypted and is pending encryption rekeying.";
1302 		break;
1303 	case SA_LV_STATUS_VPD_UNSUPPORTED:
1304 		status = "Volume status is not available through vital product data pages.";
1305 		break;
1306 	default:
1307 		status = "Volume is in an unknown state.";
1308 		break;
1309 	}
1310 
1311 	DBG_DISC("scsi BTL %d:%d:%d %s\n",
1312 		device->bus, device->target, device->lun, status);
1313 	DBG_FUNC("OUT\n");
1314 }
1315 
1316 void pqisrc_device_mem_free(pqisrc_softstate_t *softs, pqi_scsi_dev_t *device)
1317 {
1318 	DBG_FUNC("IN\n");
1319 	if (!device)
1320 		return;
1321 	if (device->raid_map) {
1322 			os_mem_free(softs, (char *)device->raid_map, sizeof(pqisrc_raid_map_t));
1323 	}
1324 	os_mem_free(softs, (char *)device,sizeof(*device));
1325 	DBG_FUNC("OUT\n");
1326 
1327 }
1328 
1329 /* OS should call this function to free the scsi device */
1330 void pqisrc_free_device(pqisrc_softstate_t * softs,pqi_scsi_dev_t *device)
1331 {
1332 
1333 		OS_ACQUIRE_SPINLOCK(&softs->devlist_lock);
1334 		if (!pqisrc_is_logical_device(device)) {
1335 			pqisrc_free_tid(softs,device->target);
1336 		}
1337 		pqisrc_device_mem_free(softs, device);
1338 		OS_RELEASE_SPINLOCK(&softs->devlist_lock);
1339 
1340 }
1341 
1342 /* Update the newly added devices to the device list */
1343 static void pqisrc_update_device_list(pqisrc_softstate_t *softs,
1344 	pqi_scsi_dev_t *new_device_list[], int num_new_devices)
1345 {
1346 	int ret;
1347 	int i;
1348 	device_status_t dev_status;
1349 	pqi_scsi_dev_t *device;
1350 	pqi_scsi_dev_t *same_device;
1351 	pqi_scsi_dev_t **added = NULL;
1352 	pqi_scsi_dev_t **removed = NULL;
1353 	int nadded = 0, nremoved = 0;
1354 	int j;
1355 	int tid = 0;
1356 
1357 	DBG_FUNC("IN\n");
1358 
1359 	added = os_mem_alloc(softs, sizeof(*added) * PQI_MAX_DEVICES);
1360 	removed = os_mem_alloc(softs, sizeof(*removed) * PQI_MAX_DEVICES);
1361 
1362 	if (!added || !removed) {
1363 		DBG_WARN("Out of memory \n");
1364 		goto free_and_out;
1365 	}
1366 
1367 	OS_ACQUIRE_SPINLOCK(&softs->devlist_lock);
1368 
1369 	for(i = 0; i < PQI_MAX_DEVICES; i++) {
1370 		for(j = 0; j < PQI_MAX_MULTILUN; j++) {
1371 			if(softs->device_list[i][j] == NULL)
1372 				continue;
1373 			device = softs->device_list[i][j];
1374 			device->device_gone = true;
1375 		}
1376 	}
1377 	DBG_IO("Device list used an array\n");
1378 	for (i = 0; i < num_new_devices; i++) {
1379 		device = new_device_list[i];
1380 
1381 		dev_status = pqisrc_scsi_find_entry(softs, device,
1382 			&same_device);
1383 
1384 		switch (dev_status) {
1385 		case DEVICE_UNCHANGED:
1386 			/* New Device present in existing device list  */
1387 			device->new_device = false;
1388 			same_device->device_gone = false;
1389 			pqisrc_exist_device_update(softs, same_device, device);
1390 			break;
1391 		case DEVICE_NOT_FOUND:
1392 			/* Device not found in existing list */
1393 			device->new_device = true;
1394 			break;
1395 		case DEVICE_CHANGED:
1396 			/* Actual device gone need to add device to list*/
1397 			device->new_device = true;
1398 			break;
1399 		default:
1400 			break;
1401 		}
1402 	}
1403 	/* Process all devices that have gone away. */
1404 	for(i = 0, nremoved = 0; i < PQI_MAX_DEVICES; i++) {
1405 		for(j = 0; j < PQI_MAX_MULTILUN; j++) {
1406 			if(softs->device_list[i][j] == NULL)
1407 				continue;
1408 			device = softs->device_list[i][j];
1409 			if (device->device_gone) {
1410 				softs->device_list[device->target][device->lun] = NULL;
1411 				removed[nremoved] = device;
1412 				nremoved++;
1413 			}
1414 		}
1415 	}
1416 
1417 	/* Process all new devices. */
1418 	for (i = 0, nadded = 0; i < num_new_devices; i++) {
1419 		device = new_device_list[i];
1420 		if (!device->new_device)
1421 			continue;
1422 		if (device->volume_offline)
1423 			continue;
1424 
1425 		/* physical device */
1426 		if (!pqisrc_is_logical_device(device)) {
1427 			tid = pqisrc_alloc_tid(softs);
1428 			if(INVALID_ELEM != tid)
1429 				pqisrc_set_btl(device, PQI_PHYSICAL_DEVICE_BUS, tid, 0);
1430 		}
1431 
1432  		softs->device_list[device->target][device->lun] = device;
1433 		DBG_DISC("Added device %p at B : %d T : %d L : %d\n",device,
1434 			device->bus,device->target,device->lun);
1435 		/* To prevent this entry from being freed later. */
1436 		new_device_list[i] = NULL;
1437 		added[nadded] = device;
1438 		nadded++;
1439 	}
1440 
1441 	pqisrc_update_log_dev_qdepth(softs);
1442 
1443 	for(i = 0; i < PQI_MAX_DEVICES; i++) {
1444 		for(j = 0; j < PQI_MAX_MULTILUN; j++) {
1445 			if(softs->device_list[i][j] == NULL)
1446 				continue;
1447 			device = softs->device_list[i][j];
1448 			device->offload_enabled = device->offload_enabled_pending;
1449 		}
1450 	}
1451 
1452 	OS_RELEASE_SPINLOCK(&softs->devlist_lock);
1453 
1454 	for(i = 0; i < nremoved; i++) {
1455 		device = removed[i];
1456 		if (device == NULL)
1457 			continue;
1458 		pqisrc_remove_device(softs, device);
1459 		pqisrc_display_device_info(softs, "removed", device);
1460 
1461 	}
1462 
1463 	for(i = 0; i < PQI_MAX_DEVICES; i++) {
1464 		for(j = 0; j < PQI_MAX_MULTILUN; j++) {
1465 			if(softs->device_list[i][j] == NULL)
1466 				continue;
1467 			device = softs->device_list[i][j];
1468 			/*
1469 			* Notify the OS upper layer if the queue depth of any existing device has
1470 			* changed.
1471 			*/
1472 			if (device->queue_depth !=
1473 				device->advertised_queue_depth) {
1474 				device->advertised_queue_depth = device->queue_depth;
1475 				/* TBD: Call OS upper layer function to change device Q depth */
1476 			}
1477 		}
1478 	}
1479 	for(i = 0; i < nadded; i++) {
1480 		device = added[i];
1481 		if (device->expose_device) {
1482 			ret = pqisrc_add_device(softs, device);
1483 			if (ret) {
1484 				DBG_WARN("scsi %d:%d:%d addition failed, device not added\n",
1485 					device->bus, device->target,
1486 					device->lun);
1487 				pqisrc_adjust_list(softs, device);
1488 				continue;
1489 			}
1490 		}
1491 
1492 		pqisrc_display_device_info(softs, "added", device);
1493 	}
1494 
1495 	/* Process all volumes that are offline. */
1496 	for (i = 0; i < num_new_devices; i++) {
1497 		device = new_device_list[i];
1498 		if (!device)
1499 			continue;
1500 		if (!device->new_device)
1501 			continue;
1502 		if (device->volume_offline) {
1503 			pqisrc_display_volume_status(softs, device);
1504 			pqisrc_display_device_info(softs, "offline", device);
1505 		}
1506 	}
1507 
1508 free_and_out:
1509 	if (added)
1510 		os_mem_free(softs, (char *)added,
1511 			    sizeof(*added) * PQI_MAX_DEVICES);
1512 	if (removed)
1513 		os_mem_free(softs, (char *)removed,
1514 			    sizeof(*removed) * PQI_MAX_DEVICES);
1515 
1516 	DBG_FUNC("OUT\n");
1517 }
1518 
1519 /*
1520  * Let the Adapter know about driver version using one of BMIC
1521  * BMIC_WRITE_HOST_WELLNESS
1522  */
1523 int pqisrc_write_driver_version_to_host_wellness(pqisrc_softstate_t *softs)
1524 {
1525 	int rval = PQI_STATUS_SUCCESS;
1526 	struct bmic_host_wellness_driver_version *host_wellness_driver_ver;
1527 	size_t data_length;
1528 	pqisrc_raid_req_t request;
1529 
1530 	DBG_FUNC("IN\n");
1531 
1532 	memset(&request, 0, sizeof(request));
1533 	data_length = sizeof(*host_wellness_driver_ver);
1534 
1535 	host_wellness_driver_ver = os_mem_alloc(softs, data_length);
1536 	if (!host_wellness_driver_ver) {
1537 		DBG_ERR("failed to allocate memory for host wellness driver_version\n");
1538 		return PQI_STATUS_FAILURE;
1539 	}
1540 
1541 	host_wellness_driver_ver->start_tag[0] = '<';
1542 	host_wellness_driver_ver->start_tag[1] = 'H';
1543 	host_wellness_driver_ver->start_tag[2] = 'W';
1544 	host_wellness_driver_ver->start_tag[3] = '>';
1545 	host_wellness_driver_ver->driver_version_tag[0] = 'D';
1546 	host_wellness_driver_ver->driver_version_tag[1] = 'V';
1547 	host_wellness_driver_ver->driver_version_length = LE_16(sizeof(host_wellness_driver_ver->driver_version));
1548 	strncpy(host_wellness_driver_ver->driver_version, softs->os_name,
1549         sizeof(host_wellness_driver_ver->driver_version));
1550     if (strlen(softs->os_name) < sizeof(host_wellness_driver_ver->driver_version) ) {
1551         strncpy(host_wellness_driver_ver->driver_version + strlen(softs->os_name), PQISRC_DRIVER_VERSION,
1552 			sizeof(host_wellness_driver_ver->driver_version) -  strlen(softs->os_name));
1553     } else {
1554         DBG_DISC("OS name length(%lu) is longer than buffer of driver_version\n",
1555             strlen(softs->os_name));
1556     }
1557 	host_wellness_driver_ver->driver_version[sizeof(host_wellness_driver_ver->driver_version) - 1] = '\0';
1558 	host_wellness_driver_ver->end_tag[0] = 'Z';
1559 	host_wellness_driver_ver->end_tag[1] = 'Z';
1560 
1561 	rval = pqisrc_build_send_raid_request(softs, &request, host_wellness_driver_ver,data_length,
1562 					BMIC_WRITE_HOST_WELLNESS, 0, (uint8_t *)RAID_CTLR_LUNID, NULL);
1563 
1564 	os_mem_free(softs, (char *)host_wellness_driver_ver, data_length);
1565 
1566 	DBG_FUNC("OUT");
1567 	return rval;
1568 }
1569 
1570 /*
1571  * Write current RTC time from host to the adapter using
1572  * BMIC_WRITE_HOST_WELLNESS
1573  */
1574 int pqisrc_write_current_time_to_host_wellness(pqisrc_softstate_t *softs)
1575 {
1576 	int rval = PQI_STATUS_SUCCESS;
1577 	struct bmic_host_wellness_time *host_wellness_time;
1578 	size_t data_length;
1579 	pqisrc_raid_req_t request;
1580 
1581 	DBG_FUNC("IN\n");
1582 
1583 	memset(&request, 0, sizeof(request));
1584 	data_length = sizeof(*host_wellness_time);
1585 
1586 	host_wellness_time = os_mem_alloc(softs, data_length);
1587 	if (!host_wellness_time) {
1588 		DBG_ERR("failed to allocate memory for host wellness time structure\n");
1589 		return PQI_STATUS_FAILURE;
1590 	}
1591 
1592 	host_wellness_time->start_tag[0] = '<';
1593 	host_wellness_time->start_tag[1] = 'H';
1594 	host_wellness_time->start_tag[2] = 'W';
1595 	host_wellness_time->start_tag[3] = '>';
1596 	host_wellness_time->time_tag[0] = 'T';
1597 	host_wellness_time->time_tag[1] = 'D';
1598 	host_wellness_time->time_length = LE_16(offsetof(struct bmic_host_wellness_time, time_length) -
1599 											offsetof(struct bmic_host_wellness_time, century));
1600 
1601 	os_get_time(host_wellness_time);
1602 
1603 	host_wellness_time->dont_write_tag[0] = 'D';
1604 	host_wellness_time->dont_write_tag[1] = 'W';
1605 	host_wellness_time->end_tag[0] = 'Z';
1606 	host_wellness_time->end_tag[1] = 'Z';
1607 
1608 	rval = pqisrc_build_send_raid_request(softs, &request, host_wellness_time,data_length,
1609 					BMIC_WRITE_HOST_WELLNESS, 0, (uint8_t *)RAID_CTLR_LUNID, NULL);
1610 
1611 	os_mem_free(softs, (char *)host_wellness_time, data_length);
1612 
1613 	DBG_FUNC("OUT");
1614 	return rval;
1615 }
1616 
1617 /*
1618  * Function used to perform a rescan of scsi devices
1619  * for any config change events
1620  */
1621 int pqisrc_scan_devices(pqisrc_softstate_t *softs)
1622 {
1623 	boolean_t is_physical_device;
1624 	int ret = PQI_STATUS_FAILURE;
1625 	int i;
1626 	int new_dev_cnt;
1627 	int phy_log_dev_cnt;
1628 	uint8_t *scsi3addr;
1629 	uint32_t physical_cnt;
1630 	uint32_t logical_cnt;
1631 	uint32_t ndev_allocated = 0;
1632 	size_t phys_data_length, log_data_length;
1633 	reportlun_data_ext_t *physical_dev_list = NULL;
1634 	reportlun_data_ext_t *logical_dev_list = NULL;
1635 	reportlun_ext_entry_t *lun_ext_entry = NULL;
1636 	bmic_ident_physdev_t *bmic_phy_info = NULL;
1637 	pqi_scsi_dev_t **new_device_list = NULL;
1638 	pqi_scsi_dev_t *device = NULL;
1639 
1640 	DBG_FUNC("IN\n");
1641 
1642 	ret = pqisrc_get_phys_log_device_list(softs, &physical_dev_list, &logical_dev_list,
1643 				      &phys_data_length, &log_data_length);
1644 
1645 	if (ret)
1646 		goto err_out;
1647 
1648 	physical_cnt = BE_32(physical_dev_list->header.list_length)
1649 		/ sizeof(physical_dev_list->lun_entries[0]);
1650 
1651 	logical_cnt = BE_32(logical_dev_list->header.list_length)
1652 		/ sizeof(logical_dev_list->lun_entries[0]);
1653 
1654 	DBG_DISC("physical_cnt %d logical_cnt %d\n", physical_cnt, logical_cnt);
1655 
1656 	if (physical_cnt) {
1657 		bmic_phy_info = os_mem_alloc(softs, sizeof(*bmic_phy_info));
1658 		if (bmic_phy_info == NULL) {
1659 			ret = PQI_STATUS_FAILURE;
1660 			DBG_ERR("failed to allocate memory for BMIC ID PHYS Device : %d\n", ret);
1661 			goto err_out;
1662 		}
1663 	}
1664 	phy_log_dev_cnt = physical_cnt + logical_cnt;
1665 	new_device_list = os_mem_alloc(softs,
1666 				sizeof(*new_device_list) * phy_log_dev_cnt);
1667 
1668 	if (new_device_list == NULL) {
1669 		ret = PQI_STATUS_FAILURE;
1670 		DBG_ERR("failed to allocate memory for device list : %d\n", ret);
1671 		goto err_out;
1672 	}
1673 
1674 	for (i = 0; i < phy_log_dev_cnt; i++) {
1675 		new_device_list[i] = os_mem_alloc(softs,
1676 						sizeof(*new_device_list[i]));
1677 		if (new_device_list[i] == NULL) {
1678 			ret = PQI_STATUS_FAILURE;
1679 			DBG_ERR("failed to allocate memory for device list : %d\n", ret);
1680 			ndev_allocated = i;
1681 			goto err_out;
1682 		}
1683 	}
1684 
1685 	ndev_allocated = phy_log_dev_cnt;
1686 	new_dev_cnt = 0;
1687 	for (i = 0; i < phy_log_dev_cnt; i++) {
1688 		if (i < physical_cnt) {
1689 			is_physical_device = true;
1690 			lun_ext_entry = &physical_dev_list->lun_entries[i];
1691 		} else {
1692 			is_physical_device = false;
1693 			lun_ext_entry =
1694 				&logical_dev_list->lun_entries[i - physical_cnt];
1695 		}
1696 
1697 		scsi3addr = lun_ext_entry->lunid;
1698 		/* Save the target sas adderess for external raid device */
1699 		if(lun_ext_entry->device_type == CONTROLLER_DEVICE) {
1700 			int target = lun_ext_entry->lunid[3] & 0x3f;
1701 			softs->target_sas_addr[target] = BE_64(lun_ext_entry->wwid);
1702 		}
1703 
1704 		/* Skip masked physical non-disk devices. */
1705 		if (MASKED_DEVICE(scsi3addr) && is_physical_device
1706 				&& (lun_ext_entry->ioaccel_handle == 0))
1707 			continue;
1708 
1709 		device = new_device_list[new_dev_cnt];
1710 		memset(device, 0, sizeof(*device));
1711 		memcpy(device->scsi3addr, scsi3addr, sizeof(device->scsi3addr));
1712 		device->wwid = lun_ext_entry->wwid;
1713 		device->is_physical_device = is_physical_device;
1714 		if (!is_physical_device)
1715 			device->is_external_raid_device =
1716 				pqisrc_is_external_raid_addr(scsi3addr);
1717 
1718 
1719 		/* Get device type, vendor, model, device ID. */
1720 		ret = pqisrc_get_dev_data(softs, device);
1721 		if (ret) {
1722 			DBG_WARN("Inquiry failed, skipping device %016llx\n",
1723 				 (unsigned long long)BE_64(device->scsi3addr[0]));
1724 			DBG_DISC("INQUIRY FAILED \n");
1725 			continue;
1726 		}
1727 		pqisrc_assign_btl(device);
1728 
1729 		/*
1730 		 * Expose all devices except for physical devices that
1731 		 * are masked.
1732 		 */
1733 		if (device->is_physical_device &&
1734 			MASKED_DEVICE(scsi3addr))
1735 			device->expose_device = false;
1736 		else
1737 			device->expose_device = true;
1738 
1739 		if (device->is_physical_device &&
1740 		    (lun_ext_entry->device_flags &
1741 		     REPORT_LUN_DEV_FLAG_AIO_ENABLED) &&
1742 		     lun_ext_entry->ioaccel_handle) {
1743 			device->aio_enabled = true;
1744 		}
1745 		switch (device->devtype) {
1746 		case ROM_DEVICE:
1747 			/*
1748 			 * We don't *really* support actual CD-ROM devices,
1749 			 * but we do support the HP "One Button Disaster
1750 			 * Recovery" tape drive which temporarily pretends to
1751 			 * be a CD-ROM drive.
1752 			 */
1753 			if (device->is_obdr_device)
1754 				new_dev_cnt++;
1755 			break;
1756 		case DISK_DEVICE:
1757 		case ZBC_DEVICE:
1758 			if (device->is_physical_device) {
1759 				device->ioaccel_handle =
1760 					lun_ext_entry->ioaccel_handle;
1761 				device->sas_address = BE_64(lun_ext_entry->wwid);
1762 				pqisrc_get_physical_device_info(softs, device,
1763 					bmic_phy_info);
1764 			}
1765 			new_dev_cnt++;
1766 			break;
1767 		case ENCLOSURE_DEVICE:
1768 			if (device->is_physical_device) {
1769 				device->sas_address = BE_64(lun_ext_entry->wwid);
1770 			}
1771 			new_dev_cnt++;
1772 			break;
1773 		case TAPE_DEVICE:
1774 		case MEDIUM_CHANGER_DEVICE:
1775 			new_dev_cnt++;
1776 			break;
1777 		case RAID_DEVICE:
1778 			/*
1779 			 * Only present the HBA controller itself as a RAID
1780 			 * controller.  If it's a RAID controller other than
1781 			 * the HBA itself (an external RAID controller, MSA500
1782 			 * or similar), don't present it.
1783 			 */
1784 			if (pqisrc_is_hba_lunid(scsi3addr))
1785 				new_dev_cnt++;
1786 			break;
1787 		case SES_DEVICE:
1788 		case CONTROLLER_DEVICE:
1789 			break;
1790 		}
1791 	}
1792 	DBG_DISC("new_dev_cnt %d\n", new_dev_cnt);
1793 
1794 	pqisrc_update_device_list(softs, new_device_list, new_dev_cnt);
1795 
1796 err_out:
1797 	if (new_device_list) {
1798 		for (i = 0; i < ndev_allocated; i++) {
1799 			if (new_device_list[i]) {
1800 				if(new_device_list[i]->raid_map)
1801 					os_mem_free(softs, (char *)new_device_list[i]->raid_map,
1802 					    					sizeof(pqisrc_raid_map_t));
1803 				os_mem_free(softs, (char*)new_device_list[i],
1804 					    			sizeof(*new_device_list[i]));
1805 			}
1806 		}
1807 		os_mem_free(softs, (char *)new_device_list,
1808 			    		sizeof(*new_device_list) * ndev_allocated);
1809 	}
1810 	if(physical_dev_list)
1811 		os_mem_free(softs, (char *)physical_dev_list, phys_data_length);
1812     	if(logical_dev_list)
1813 		os_mem_free(softs, (char *)logical_dev_list, log_data_length);
1814 	if (bmic_phy_info)
1815 		os_mem_free(softs, (char *)bmic_phy_info, sizeof(*bmic_phy_info));
1816 
1817 	DBG_FUNC("OUT \n");
1818 
1819 	return ret;
1820 }
1821 
1822 /*
1823  * Clean up memory allocated for devices.
1824  */
1825 void pqisrc_cleanup_devices(pqisrc_softstate_t *softs)
1826 {
1827 
1828 	int i = 0,j = 0;
1829 	pqi_scsi_dev_t *dvp = NULL;
1830 	DBG_FUNC("IN\n");
1831 
1832  	for(i = 0; i < PQI_MAX_DEVICES; i++) {
1833 		for(j = 0; j < PQI_MAX_MULTILUN; j++) {
1834 			if (softs->device_list[i][j] == NULL)
1835 				continue;
1836 			dvp = softs->device_list[i][j];
1837 			pqisrc_device_mem_free(softs, dvp);
1838 		}
1839 	}
1840 	DBG_FUNC("OUT\n");
1841 }
1842