~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/scsi/ses.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
35
35
 
36
36
struct ses_device {
37
37
        unsigned char *page1;
 
38
        unsigned char *page1_types;
38
39
        unsigned char *page2;
39
40
        unsigned char *page10;
40
41
        short page1_len;
 
42
        short page1_num_types;
41
43
        short page2_len;
42
44
        short page10_len;
43
45
};
110
112
        int i, j, count = 0, descriptor = ecomp->number;
111
113
        struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
112
114
        struct ses_device *ses_dev = edev->scratch;
113
 
        unsigned char *type_ptr = ses_dev->page1 + 12 + ses_dev->page1[11];
 
115
        unsigned char *type_ptr = ses_dev->page1_types;
114
116
        unsigned char *desc_ptr = ses_dev->page2 + 8;
115
117
 
116
118
        /* Clear everything */
117
119
        memset(desc_ptr, 0, ses_dev->page2_len - 8);
118
 
        for (i = 0; i < ses_dev->page1[10]; i++, type_ptr += 4) {
 
120
        for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
119
121
                for (j = 0; j < type_ptr[1]; j++) {
120
122
                        desc_ptr += 4;
121
123
                        if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
140
142
        int i, j, count = 0, descriptor = ecomp->number;
141
143
        struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
142
144
        struct ses_device *ses_dev = edev->scratch;
143
 
        unsigned char *type_ptr = ses_dev->page1 + 12 + ses_dev->page1[11];
 
145
        unsigned char *type_ptr = ses_dev->page1_types;
144
146
        unsigned char *desc_ptr = ses_dev->page2 + 8;
145
147
 
146
148
        ses_recv_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len);
147
149
 
148
 
        for (i = 0; i < ses_dev->page1[10]; i++, type_ptr += 4) {
 
150
        for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
149
151
                for (j = 0; j < type_ptr[1]; j++) {
150
152
                        desc_ptr += 4;
151
153
                        if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
358
360
        unsigned char *buf = NULL, *type_ptr, *desc_ptr, *addl_desc_ptr = NULL;
359
361
        int i, j, page7_len, len, components;
360
362
        struct ses_device *ses_dev = edev->scratch;
361
 
        int types = ses_dev->page1[10];
 
363
        int types = ses_dev->page1_num_types;
362
364
        unsigned char *hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
363
365
 
364
366
        if (!hdr_buf)
393
395
        }
394
396
        if (ses_dev->page10)
395
397
                addl_desc_ptr = ses_dev->page10 + 8;
396
 
        type_ptr = ses_dev->page1 + 12 + ses_dev->page1[11];
 
398
        type_ptr = ses_dev->page1_types;
397
399
        components = 0;
398
400
        for (i = 0; i < types; i++, type_ptr += 4) {
399
401
                for (j = 0; j < type_ptr[1]; j++) {
503
505
        u32 result;
504
506
        int i, types, len, components = 0;
505
507
        int err = -ENOMEM;
 
508
        int num_enclosures;
506
509
        struct enclosure_device *edev;
507
510
        struct ses_component *scomp = NULL;
508
511
 
530
533
        if (result)
531
534
                goto recv_failed;
532
535
 
533
 
        if (hdr_buf[1] != 0) {
534
 
                /* FIXME: need subenclosure support; I've just never
535
 
                 * seen a device with subenclosures and it makes the
536
 
                 * traversal routines more complex */
537
 
                sdev_printk(KERN_ERR, sdev,
538
 
                        "FIXME driver has no support for subenclosures (%d)\n",
539
 
                        hdr_buf[1]);
540
 
                goto err_free;
541
 
        }
542
 
 
543
536
        len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
544
537
        buf = kzalloc(len, GFP_KERNEL);
545
538
        if (!buf)
549
542
        if (result)
550
543
                goto recv_failed;
551
544
 
552
 
        types = buf[10];
553
 
 
554
 
        type_ptr = buf + 12 + buf[11];
555
 
 
556
 
        for (i = 0; i < types; i++, type_ptr += 4) {
 
545
        types = 0;
 
546
 
 
547
        /* we always have one main enclosure and the rest are referred
 
548
         * to as secondary subenclosures */
 
549
        num_enclosures = buf[1] + 1;
 
550
 
 
551
        /* begin at the enclosure descriptor */
 
552
        type_ptr = buf + 8;
 
553
        /* skip all the enclosure descriptors */
 
554
        for (i = 0; i < num_enclosures && type_ptr < buf + len; i++) {
 
555
                types += type_ptr[2];
 
556
                type_ptr += type_ptr[3] + 4;
 
557
        }
 
558
 
 
559
        ses_dev->page1_types = type_ptr;
 
560
        ses_dev->page1_num_types = types;
 
561
 
 
562
        for (i = 0; i < types && type_ptr < buf + len; i++, type_ptr += 4) {
557
563
                if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
558
564
                    type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE)
559
565
                        components += type_ptr[1];