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