1/*
2 * SCSI Enclosure Services
3 *
4 * Copyright (C) 2008 James Bottomley <James.Bottomley@HansenPartnership.com>
5 *
6**-----------------------------------------------------------------------------
7**
8**  This program is free software; you can redistribute it and/or
9**  modify it under the terms of the GNU General Public License
10**  version 2 as published by the Free Software Foundation.
11**
12**  This program is distributed in the hope that it will be useful,
13**  but WITHOUT ANY WARRANTY; without even the implied warranty of
14**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15**  GNU General Public License for more details.
16**
17**  You should have received a copy of the GNU General Public License
18**  along with this program; if not, write to the Free Software
19**  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20**
21**-----------------------------------------------------------------------------
22*/
23
24#include <linux/slab.h>
25#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/enclosure.h>
28#include <asm/unaligned.h>
29
30#include <scsi/scsi.h>
31#include <scsi/scsi_cmnd.h>
32#include <scsi/scsi_dbg.h>
33#include <scsi/scsi_device.h>
34#include <scsi/scsi_driver.h>
35#include <scsi/scsi_host.h>
36
37struct ses_device {
38	unsigned char *page1;
39	unsigned char *page1_types;
40	unsigned char *page2;
41	unsigned char *page10;
42	short page1_len;
43	short page1_num_types;
44	short page2_len;
45	short page10_len;
46};
47
48struct ses_component {
49	u64 addr;
50};
51
52static int ses_probe(struct device *dev)
53{
54	struct scsi_device *sdev = to_scsi_device(dev);
55	int err = -ENODEV;
56
57	if (sdev->type != TYPE_ENCLOSURE)
58		goto out;
59
60	err = 0;
61	sdev_printk(KERN_NOTICE, sdev, "Attached Enclosure device\n");
62
63 out:
64	return err;
65}
66
67#define SES_TIMEOUT (30 * HZ)
68#define SES_RETRIES 3
69
70static void init_device_slot_control(unsigned char *dest_desc,
71				     struct enclosure_component *ecomp,
72				     unsigned char *status)
73{
74	memcpy(dest_desc, status, 4);
75	dest_desc[0] = 0;
76	/* only clear byte 1 for ENCLOSURE_COMPONENT_DEVICE */
77	if (ecomp->type == ENCLOSURE_COMPONENT_DEVICE)
78		dest_desc[1] = 0;
79	dest_desc[2] &= 0xde;
80	dest_desc[3] &= 0x3c;
81}
82
83
84static int ses_recv_diag(struct scsi_device *sdev, int page_code,
85			 void *buf, int bufflen)
86{
87	int ret;
88	unsigned char cmd[] = {
89		RECEIVE_DIAGNOSTIC,
90		1,		/* Set PCV bit */
91		page_code,
92		bufflen >> 8,
93		bufflen & 0xff,
94		0
95	};
96	unsigned char recv_page_code;
97
98	ret =  scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
99				NULL, SES_TIMEOUT, SES_RETRIES, NULL);
100	if (unlikely(!ret))
101		return ret;
102
103	recv_page_code = ((unsigned char *)buf)[0];
104
105	if (likely(recv_page_code == page_code))
106		return ret;
107
108	/* successful diagnostic but wrong page code.  This happens to some
109	 * USB devices, just print a message and pretend there was an error */
110
111	sdev_printk(KERN_ERR, sdev,
112		    "Wrong diagnostic page; asked for %d got %u\n",
113		    page_code, recv_page_code);
114
115	return -EINVAL;
116}
117
118static int ses_send_diag(struct scsi_device *sdev, int page_code,
119			 void *buf, int bufflen)
120{
121	u32 result;
122
123	unsigned char cmd[] = {
124		SEND_DIAGNOSTIC,
125		0x10,		/* Set PF bit */
126		0,
127		bufflen >> 8,
128		bufflen & 0xff,
129		0
130	};
131
132	result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
133				  NULL, SES_TIMEOUT, SES_RETRIES, NULL);
134	if (result)
135		sdev_printk(KERN_ERR, sdev, "SEND DIAGNOSTIC result: %8x\n",
136			    result);
137	return result;
138}
139
140static int ses_set_page2_descriptor(struct enclosure_device *edev,
141				      struct enclosure_component *ecomp,
142				      unsigned char *desc)
143{
144	int i, j, count = 0, descriptor = ecomp->number;
145	struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
146	struct ses_device *ses_dev = edev->scratch;
147	unsigned char *type_ptr = ses_dev->page1_types;
148	unsigned char *desc_ptr = ses_dev->page2 + 8;
149
150	/* Clear everything */
151	memset(desc_ptr, 0, ses_dev->page2_len - 8);
152	for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
153		for (j = 0; j < type_ptr[1]; j++) {
154			desc_ptr += 4;
155			if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
156			    type_ptr[0] != ENCLOSURE_COMPONENT_ARRAY_DEVICE)
157				continue;
158			if (count++ == descriptor) {
159				memcpy(desc_ptr, desc, 4);
160				/* set select */
161				desc_ptr[0] |= 0x80;
162				/* clear reserved, just in case */
163				desc_ptr[0] &= 0xf0;
164			}
165		}
166	}
167
168	return ses_send_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len);
169}
170
171static unsigned char *ses_get_page2_descriptor(struct enclosure_device *edev,
172				      struct enclosure_component *ecomp)
173{
174	int i, j, count = 0, descriptor = ecomp->number;
175	struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
176	struct ses_device *ses_dev = edev->scratch;
177	unsigned char *type_ptr = ses_dev->page1_types;
178	unsigned char *desc_ptr = ses_dev->page2 + 8;
179
180	ses_recv_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len);
181
182	for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
183		for (j = 0; j < type_ptr[1]; j++) {
184			desc_ptr += 4;
185			if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
186			    type_ptr[0] != ENCLOSURE_COMPONENT_ARRAY_DEVICE)
187				continue;
188			if (count++ == descriptor)
189				return desc_ptr;
190		}
191	}
192	return NULL;
193}
194
195/* For device slot and array device slot elements, byte 3 bit 6
196 * is "fault sensed" while byte 3 bit 5 is "fault reqstd". As this
197 * code stands these bits are shifted 4 positions right so in
198 * sysfs they will appear as bits 2 and 1 respectively. Strange. */
199static void ses_get_fault(struct enclosure_device *edev,
200			  struct enclosure_component *ecomp)
201{
202	unsigned char *desc;
203
204	desc = ses_get_page2_descriptor(edev, ecomp);
205	if (desc)
206		ecomp->fault = (desc[3] & 0x60) >> 4;
207}
208
209static int ses_set_fault(struct enclosure_device *edev,
210			  struct enclosure_component *ecomp,
211			 enum enclosure_component_setting val)
212{
213	unsigned char desc[4];
214	unsigned char *desc_ptr;
215
216	desc_ptr = ses_get_page2_descriptor(edev, ecomp);
217
218	if (!desc_ptr)
219		return -EIO;
220
221	init_device_slot_control(desc, ecomp, desc_ptr);
222
223	switch (val) {
224	case ENCLOSURE_SETTING_DISABLED:
225		desc[3] &= 0xdf;
226		break;
227	case ENCLOSURE_SETTING_ENABLED:
228		desc[3] |= 0x20;
229		break;
230	default:
231		/* SES doesn't do the SGPIO blink settings */
232		return -EINVAL;
233	}
234
235	return ses_set_page2_descriptor(edev, ecomp, desc);
236}
237
238static void ses_get_status(struct enclosure_device *edev,
239			   struct enclosure_component *ecomp)
240{
241	unsigned char *desc;
242
243	desc = ses_get_page2_descriptor(edev, ecomp);
244	if (desc)
245		ecomp->status = (desc[0] & 0x0f);
246}
247
248static void ses_get_locate(struct enclosure_device *edev,
249			   struct enclosure_component *ecomp)
250{
251	unsigned char *desc;
252
253	desc = ses_get_page2_descriptor(edev, ecomp);
254	if (desc)
255		ecomp->locate = (desc[2] & 0x02) ? 1 : 0;
256}
257
258static int ses_set_locate(struct enclosure_device *edev,
259			  struct enclosure_component *ecomp,
260			  enum enclosure_component_setting val)
261{
262	unsigned char desc[4];
263	unsigned char *desc_ptr;
264
265	desc_ptr = ses_get_page2_descriptor(edev, ecomp);
266
267	if (!desc_ptr)
268		return -EIO;
269
270	init_device_slot_control(desc, ecomp, desc_ptr);
271
272	switch (val) {
273	case ENCLOSURE_SETTING_DISABLED:
274		desc[2] &= 0xfd;
275		break;
276	case ENCLOSURE_SETTING_ENABLED:
277		desc[2] |= 0x02;
278		break;
279	default:
280		/* SES doesn't do the SGPIO blink settings */
281		return -EINVAL;
282	}
283	return ses_set_page2_descriptor(edev, ecomp, desc);
284}
285
286static int ses_set_active(struct enclosure_device *edev,
287			  struct enclosure_component *ecomp,
288			  enum enclosure_component_setting val)
289{
290	unsigned char desc[4];
291	unsigned char *desc_ptr;
292
293	desc_ptr = ses_get_page2_descriptor(edev, ecomp);
294
295	if (!desc_ptr)
296		return -EIO;
297
298	init_device_slot_control(desc, ecomp, desc_ptr);
299
300	switch (val) {
301	case ENCLOSURE_SETTING_DISABLED:
302		desc[2] &= 0x7f;
303		ecomp->active = 0;
304		break;
305	case ENCLOSURE_SETTING_ENABLED:
306		desc[2] |= 0x80;
307		ecomp->active = 1;
308		break;
309	default:
310		/* SES doesn't do the SGPIO blink settings */
311		return -EINVAL;
312	}
313	return ses_set_page2_descriptor(edev, ecomp, desc);
314}
315
316static int ses_show_id(struct enclosure_device *edev, char *buf)
317{
318	struct ses_device *ses_dev = edev->scratch;
319	unsigned long long id = get_unaligned_be64(ses_dev->page1+8+4);
320
321	return sprintf(buf, "%#llx\n", id);
322}
323
324static void ses_get_power_status(struct enclosure_device *edev,
325				 struct enclosure_component *ecomp)
326{
327	unsigned char *desc;
328
329	desc = ses_get_page2_descriptor(edev, ecomp);
330	if (desc)
331		ecomp->power_status = (desc[3] & 0x10) ? 0 : 1;
332}
333
334static int ses_set_power_status(struct enclosure_device *edev,
335				struct enclosure_component *ecomp,
336				int val)
337{
338	unsigned char desc[4];
339	unsigned char *desc_ptr;
340
341	desc_ptr = ses_get_page2_descriptor(edev, ecomp);
342
343	if (!desc_ptr)
344		return -EIO;
345
346	init_device_slot_control(desc, ecomp, desc_ptr);
347
348	switch (val) {
349	/* power = 1 is device_off = 0 and vice versa */
350	case 0:
351		desc[3] |= 0x10;
352		break;
353	case 1:
354		desc[3] &= 0xef;
355		break;
356	default:
357		return -EINVAL;
358	}
359	ecomp->power_status = val;
360	return ses_set_page2_descriptor(edev, ecomp, desc);
361}
362
363static struct enclosure_component_callbacks ses_enclosure_callbacks = {
364	.get_fault		= ses_get_fault,
365	.set_fault		= ses_set_fault,
366	.get_status		= ses_get_status,
367	.get_locate		= ses_get_locate,
368	.set_locate		= ses_set_locate,
369	.get_power_status	= ses_get_power_status,
370	.set_power_status	= ses_set_power_status,
371	.set_active		= ses_set_active,
372	.show_id		= ses_show_id,
373};
374
375struct ses_host_edev {
376	struct Scsi_Host *shost;
377	struct enclosure_device *edev;
378};
379
380#if 0
381int ses_match_host(struct enclosure_device *edev, void *data)
382{
383	struct ses_host_edev *sed = data;
384	struct scsi_device *sdev;
385
386	if (!scsi_is_sdev_device(edev->edev.parent))
387		return 0;
388
389	sdev = to_scsi_device(edev->edev.parent);
390
391	if (sdev->host != sed->shost)
392		return 0;
393
394	sed->edev = edev;
395	return 1;
396}
397#endif  /*  0  */
398
399static void ses_process_descriptor(struct enclosure_component *ecomp,
400				   unsigned char *desc)
401{
402	int eip = desc[0] & 0x10;
403	int invalid = desc[0] & 0x80;
404	enum scsi_protocol proto = desc[0] & 0x0f;
405	u64 addr = 0;
406	int slot = -1;
407	struct ses_component *scomp = ecomp->scratch;
408	unsigned char *d;
409
410	if (invalid)
411		return;
412
413	switch (proto) {
414	case SCSI_PROTOCOL_FCP:
415		if (eip) {
416			d = desc + 4;
417			slot = d[3];
418		}
419		break;
420	case SCSI_PROTOCOL_SAS:
421		if (eip) {
422			d = desc + 4;
423			slot = d[3];
424			d = desc + 8;
425		} else
426			d = desc + 4;
427		/* only take the phy0 addr */
428		addr = (u64)d[12] << 56 |
429			(u64)d[13] << 48 |
430			(u64)d[14] << 40 |
431			(u64)d[15] << 32 |
432			(u64)d[16] << 24 |
433			(u64)d[17] << 16 |
434			(u64)d[18] << 8 |
435			(u64)d[19];
436		break;
437	default:
438		/* FIXME: Need to add more protocols than just SAS */
439		break;
440	}
441	ecomp->slot = slot;
442	scomp->addr = addr;
443}
444
445struct efd {
446	u64 addr;
447	struct device *dev;
448};
449
450static int ses_enclosure_find_by_addr(struct enclosure_device *edev,
451				      void *data)
452{
453	struct efd *efd = data;
454	int i;
455	struct ses_component *scomp;
456
457	if (!edev->component[0].scratch)
458		return 0;
459
460	for (i = 0; i < edev->components; i++) {
461		scomp = edev->component[i].scratch;
462		if (scomp->addr != efd->addr)
463			continue;
464
465		if (enclosure_add_device(edev, i, efd->dev) == 0)
466			kobject_uevent(&efd->dev->kobj, KOBJ_CHANGE);
467		return 1;
468	}
469	return 0;
470}
471
472#define INIT_ALLOC_SIZE 32
473
474static void ses_enclosure_data_process(struct enclosure_device *edev,
475				       struct scsi_device *sdev,
476				       int create)
477{
478	u32 result;
479	unsigned char *buf = NULL, *type_ptr, *desc_ptr, *addl_desc_ptr = NULL;
480	int i, j, page7_len, len, components;
481	struct ses_device *ses_dev = edev->scratch;
482	int types = ses_dev->page1_num_types;
483	unsigned char *hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
484
485	if (!hdr_buf)
486		goto simple_populate;
487
488	/* re-read page 10 */
489	if (ses_dev->page10)
490		ses_recv_diag(sdev, 10, ses_dev->page10, ses_dev->page10_len);
491	/* Page 7 for the descriptors is optional */
492	result = ses_recv_diag(sdev, 7, hdr_buf, INIT_ALLOC_SIZE);
493	if (result)
494		goto simple_populate;
495
496	page7_len = len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
497	/* add 1 for trailing '\0' we'll use */
498	buf = kzalloc(len + 1, GFP_KERNEL);
499	if (!buf)
500		goto simple_populate;
501	result = ses_recv_diag(sdev, 7, buf, len);
502	if (result) {
503 simple_populate:
504		kfree(buf);
505		buf = NULL;
506		desc_ptr = NULL;
507		len = 0;
508		page7_len = 0;
509	} else {
510		desc_ptr = buf + 8;
511		len = (desc_ptr[2] << 8) + desc_ptr[3];
512		/* skip past overall descriptor */
513		desc_ptr += len + 4;
514	}
515	if (ses_dev->page10)
516		addl_desc_ptr = ses_dev->page10 + 8;
517	type_ptr = ses_dev->page1_types;
518	components = 0;
519	for (i = 0; i < types; i++, type_ptr += 4) {
520		for (j = 0; j < type_ptr[1]; j++) {
521			char *name = NULL;
522			struct enclosure_component *ecomp;
523
524			if (desc_ptr) {
525				if (desc_ptr >= buf + page7_len) {
526					desc_ptr = NULL;
527				} else {
528					len = (desc_ptr[2] << 8) + desc_ptr[3];
529					desc_ptr += 4;
530					/* Add trailing zero - pushes into
531					 * reserved space */
532					desc_ptr[len] = '\0';
533					name = desc_ptr;
534				}
535			}
536			if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
537			    type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) {
538
539				if (create)
540					ecomp =	enclosure_component_alloc(
541						edev,
542						components++,
543						type_ptr[0],
544						name);
545				else
546					ecomp = &edev->component[components++];
547
548				if (!IS_ERR(ecomp)) {
549					ses_get_power_status(edev, ecomp);
550					if (addl_desc_ptr)
551						ses_process_descriptor(
552							ecomp,
553							addl_desc_ptr);
554					if (create)
555						enclosure_component_register(
556							ecomp);
557				}
558			}
559			if (desc_ptr)
560				desc_ptr += len;
561
562			if (addl_desc_ptr &&
563			    /* only find additional descriptions for specific devices */
564			    (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
565			     type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE ||
566			     type_ptr[0] == ENCLOSURE_COMPONENT_SAS_EXPANDER ||
567			     /* these elements are optional */
568			     type_ptr[0] == ENCLOSURE_COMPONENT_SCSI_TARGET_PORT ||
569			     type_ptr[0] == ENCLOSURE_COMPONENT_SCSI_INITIATOR_PORT ||
570			     type_ptr[0] == ENCLOSURE_COMPONENT_CONTROLLER_ELECTRONICS))
571				addl_desc_ptr += addl_desc_ptr[1] + 2;
572
573		}
574	}
575	kfree(buf);
576	kfree(hdr_buf);
577}
578
579static void ses_match_to_enclosure(struct enclosure_device *edev,
580				   struct scsi_device *sdev)
581{
582	unsigned char *desc;
583	struct efd efd = {
584		.addr = 0,
585	};
586
587	ses_enclosure_data_process(edev, to_scsi_device(edev->edev.parent), 0);
588
589	if (!sdev->vpd_pg83_len)
590		return;
591
592	desc = sdev->vpd_pg83 + 4;
593	while (desc < sdev->vpd_pg83 + sdev->vpd_pg83_len) {
594		enum scsi_protocol proto = desc[0] >> 4;
595		u8 code_set = desc[0] & 0x0f;
596		u8 piv = desc[1] & 0x80;
597		u8 assoc = (desc[1] & 0x30) >> 4;
598		u8 type = desc[1] & 0x0f;
599		u8 len = desc[3];
600
601		if (piv && code_set == 1 && assoc == 1
602		    && proto == SCSI_PROTOCOL_SAS && type == 3 && len == 8)
603			efd.addr = get_unaligned_be64(&desc[4]);
604
605		desc += len + 4;
606	}
607	if (efd.addr) {
608		efd.dev = &sdev->sdev_gendev;
609
610		enclosure_for_each_device(ses_enclosure_find_by_addr, &efd);
611	}
612}
613
614static int ses_intf_add(struct device *cdev,
615			struct class_interface *intf)
616{
617	struct scsi_device *sdev = to_scsi_device(cdev->parent);
618	struct scsi_device *tmp_sdev;
619	unsigned char *buf = NULL, *hdr_buf, *type_ptr;
620	struct ses_device *ses_dev;
621	u32 result;
622	int i, types, len, components = 0;
623	int err = -ENOMEM;
624	int num_enclosures;
625	struct enclosure_device *edev;
626	struct ses_component *scomp = NULL;
627
628	if (!scsi_device_enclosure(sdev)) {
629		/* not an enclosure, but might be in one */
630		struct enclosure_device *prev = NULL;
631
632		while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
633			ses_match_to_enclosure(edev, sdev);
634			prev = edev;
635		}
636		return -ENODEV;
637	}
638
639	/* TYPE_ENCLOSURE prints a message in probe */
640	if (sdev->type != TYPE_ENCLOSURE)
641		sdev_printk(KERN_NOTICE, sdev, "Embedded Enclosure Device\n");
642
643	ses_dev = kzalloc(sizeof(*ses_dev), GFP_KERNEL);
644	hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
645	if (!hdr_buf || !ses_dev)
646		goto err_init_free;
647
648	result = ses_recv_diag(sdev, 1, hdr_buf, INIT_ALLOC_SIZE);
649	if (result)
650		goto recv_failed;
651
652	len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
653	buf = kzalloc(len, GFP_KERNEL);
654	if (!buf)
655		goto err_free;
656
657	result = ses_recv_diag(sdev, 1, buf, len);
658	if (result)
659		goto recv_failed;
660
661	types = 0;
662
663	/* we always have one main enclosure and the rest are referred
664	 * to as secondary subenclosures */
665	num_enclosures = buf[1] + 1;
666
667	/* begin at the enclosure descriptor */
668	type_ptr = buf + 8;
669	/* skip all the enclosure descriptors */
670	for (i = 0; i < num_enclosures && type_ptr < buf + len; i++) {
671		types += type_ptr[2];
672		type_ptr += type_ptr[3] + 4;
673	}
674
675	ses_dev->page1_types = type_ptr;
676	ses_dev->page1_num_types = types;
677
678	for (i = 0; i < types && type_ptr < buf + len; i++, type_ptr += 4) {
679		if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
680		    type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE)
681			components += type_ptr[1];
682	}
683	ses_dev->page1 = buf;
684	ses_dev->page1_len = len;
685	buf = NULL;
686
687	result = ses_recv_diag(sdev, 2, hdr_buf, INIT_ALLOC_SIZE);
688	if (result)
689		goto recv_failed;
690
691	len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
692	buf = kzalloc(len, GFP_KERNEL);
693	if (!buf)
694		goto err_free;
695
696	/* make sure getting page 2 actually works */
697	result = ses_recv_diag(sdev, 2, buf, len);
698	if (result)
699		goto recv_failed;
700	ses_dev->page2 = buf;
701	ses_dev->page2_len = len;
702	buf = NULL;
703
704	/* The additional information page --- allows us
705	 * to match up the devices */
706	result = ses_recv_diag(sdev, 10, hdr_buf, INIT_ALLOC_SIZE);
707	if (!result) {
708
709		len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
710		buf = kzalloc(len, GFP_KERNEL);
711		if (!buf)
712			goto err_free;
713
714		result = ses_recv_diag(sdev, 10, buf, len);
715		if (result)
716			goto recv_failed;
717		ses_dev->page10 = buf;
718		ses_dev->page10_len = len;
719		buf = NULL;
720	}
721	scomp = kzalloc(sizeof(struct ses_component) * components, GFP_KERNEL);
722	if (!scomp)
723		goto err_free;
724
725	edev = enclosure_register(cdev->parent, dev_name(&sdev->sdev_gendev),
726				  components, &ses_enclosure_callbacks);
727	if (IS_ERR(edev)) {
728		err = PTR_ERR(edev);
729		goto err_free;
730	}
731
732	kfree(hdr_buf);
733
734	edev->scratch = ses_dev;
735	for (i = 0; i < components; i++)
736		edev->component[i].scratch = scomp + i;
737
738	ses_enclosure_data_process(edev, sdev, 1);
739
740	/* see if there are any devices matching before
741	 * we found the enclosure */
742	shost_for_each_device(tmp_sdev, sdev->host) {
743		if (tmp_sdev->lun != 0 || scsi_device_enclosure(tmp_sdev))
744			continue;
745		ses_match_to_enclosure(edev, tmp_sdev);
746	}
747
748	return 0;
749
750 recv_failed:
751	sdev_printk(KERN_ERR, sdev, "Failed to get diagnostic page 0x%x\n",
752		    result);
753	err = -ENODEV;
754 err_free:
755	kfree(buf);
756	kfree(scomp);
757	kfree(ses_dev->page10);
758	kfree(ses_dev->page2);
759	kfree(ses_dev->page1);
760 err_init_free:
761	kfree(ses_dev);
762	kfree(hdr_buf);
763	sdev_printk(KERN_ERR, sdev, "Failed to bind enclosure %d\n", err);
764	return err;
765}
766
767static int ses_remove(struct device *dev)
768{
769	return 0;
770}
771
772static void ses_intf_remove_component(struct scsi_device *sdev)
773{
774	struct enclosure_device *edev, *prev = NULL;
775
776	while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
777		prev = edev;
778		if (!enclosure_remove_device(edev, &sdev->sdev_gendev))
779			break;
780	}
781	if (edev)
782		put_device(&edev->edev);
783}
784
785static void ses_intf_remove_enclosure(struct scsi_device *sdev)
786{
787	struct enclosure_device *edev;
788	struct ses_device *ses_dev;
789
790	/*  exact match to this enclosure */
791	edev = enclosure_find(&sdev->sdev_gendev, NULL);
792	if (!edev)
793		return;
794
795	ses_dev = edev->scratch;
796	edev->scratch = NULL;
797
798	kfree(ses_dev->page10);
799	kfree(ses_dev->page1);
800	kfree(ses_dev->page2);
801	kfree(ses_dev);
802
803	kfree(edev->component[0].scratch);
804
805	put_device(&edev->edev);
806	enclosure_unregister(edev);
807}
808
809static void ses_intf_remove(struct device *cdev,
810			    struct class_interface *intf)
811{
812	struct scsi_device *sdev = to_scsi_device(cdev->parent);
813
814	if (!scsi_device_enclosure(sdev))
815		ses_intf_remove_component(sdev);
816	else
817		ses_intf_remove_enclosure(sdev);
818}
819
820static struct class_interface ses_interface = {
821	.add_dev	= ses_intf_add,
822	.remove_dev	= ses_intf_remove,
823};
824
825static struct scsi_driver ses_template = {
826	.gendrv = {
827		.name		= "ses",
828		.owner		= THIS_MODULE,
829		.probe		= ses_probe,
830		.remove		= ses_remove,
831	},
832};
833
834static int __init ses_init(void)
835{
836	int err;
837
838	err = scsi_register_interface(&ses_interface);
839	if (err)
840		return err;
841
842	err = scsi_register_driver(&ses_template.gendrv);
843	if (err)
844		goto out_unreg;
845
846	return 0;
847
848 out_unreg:
849	scsi_unregister_interface(&ses_interface);
850	return err;
851}
852
853static void __exit ses_exit(void)
854{
855	scsi_unregister_driver(&ses_template.gendrv);
856	scsi_unregister_interface(&ses_interface);
857}
858
859module_init(ses_init);
860module_exit(ses_exit);
861
862MODULE_ALIAS_SCSI_DEVICE(TYPE_ENCLOSURE);
863
864MODULE_AUTHOR("James Bottomley");
865MODULE_DESCRIPTION("SCSI Enclosure Services (ses) driver");
866MODULE_LICENSE("GPL v2");
867