diff options
Diffstat (limited to 'drivers/edac/edac_device.c')
-rw-r--r-- | drivers/edac/edac_device.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index 45b8f4bdd773..ee3f1f810c1e 100644 --- a/drivers/edac/edac_device.c +++ b/drivers/edac/edac_device.c | |||
@@ -79,7 +79,7 @@ struct edac_device_ctl_info *edac_device_alloc_ctl_info( | |||
79 | unsigned total_size; | 79 | unsigned total_size; |
80 | unsigned count; | 80 | unsigned count; |
81 | unsigned instance, block, attr; | 81 | unsigned instance, block, attr; |
82 | void *pvt; | 82 | void *pvt, *p; |
83 | int err; | 83 | int err; |
84 | 84 | ||
85 | debugf4("%s() instances=%d blocks=%d\n", | 85 | debugf4("%s() instances=%d blocks=%d\n", |
@@ -92,35 +92,30 @@ struct edac_device_ctl_info *edac_device_alloc_ctl_info( | |||
92 | * to be at least as stringent as what the compiler would | 92 | * to be at least as stringent as what the compiler would |
93 | * provide if we could simply hardcode everything into a single struct. | 93 | * provide if we could simply hardcode everything into a single struct. |
94 | */ | 94 | */ |
95 | dev_ctl = (struct edac_device_ctl_info *)NULL; | 95 | p = NULL; |
96 | dev_ctl = edac_align_ptr(&p, sizeof(*dev_ctl), 1); | ||
96 | 97 | ||
97 | /* Calc the 'end' offset past end of ONE ctl_info structure | 98 | /* Calc the 'end' offset past end of ONE ctl_info structure |
98 | * which will become the start of the 'instance' array | 99 | * which will become the start of the 'instance' array |
99 | */ | 100 | */ |
100 | dev_inst = edac_align_ptr(&dev_ctl[1], sizeof(*dev_inst)); | 101 | dev_inst = edac_align_ptr(&p, sizeof(*dev_inst), nr_instances); |
101 | 102 | ||
102 | /* Calc the 'end' offset past the instance array within the ctl_info | 103 | /* Calc the 'end' offset past the instance array within the ctl_info |
103 | * which will become the start of the block array | 104 | * which will become the start of the block array |
104 | */ | 105 | */ |
105 | dev_blk = edac_align_ptr(&dev_inst[nr_instances], sizeof(*dev_blk)); | 106 | count = nr_instances * nr_blocks; |
107 | dev_blk = edac_align_ptr(&p, sizeof(*dev_blk), count); | ||
106 | 108 | ||
107 | /* Calc the 'end' offset past the dev_blk array | 109 | /* Calc the 'end' offset past the dev_blk array |
108 | * which will become the start of the attrib array, if any. | 110 | * which will become the start of the attrib array, if any. |
109 | */ | 111 | */ |
110 | count = nr_instances * nr_blocks; | 112 | /* calc how many nr_attrib we need */ |
111 | dev_attrib = edac_align_ptr(&dev_blk[count], sizeof(*dev_attrib)); | 113 | if (nr_attrib > 0) |
112 | |||
113 | /* Check for case of when an attribute array is specified */ | ||
114 | if (nr_attrib > 0) { | ||
115 | /* calc how many nr_attrib we need */ | ||
116 | count *= nr_attrib; | 114 | count *= nr_attrib; |
115 | dev_attrib = edac_align_ptr(&p, sizeof(*dev_attrib), count); | ||
117 | 116 | ||
118 | /* Calc the 'end' offset past the attributes array */ | 117 | /* Calc the 'end' offset past the attributes array */ |
119 | pvt = edac_align_ptr(&dev_attrib[count], sz_private); | 118 | pvt = edac_align_ptr(&p, sz_private, 1); |
120 | } else { | ||
121 | /* no attribute array specified */ | ||
122 | pvt = edac_align_ptr(dev_attrib, sz_private); | ||
123 | } | ||
124 | 119 | ||
125 | /* 'pvt' now points to where the private data area is. | 120 | /* 'pvt' now points to where the private data area is. |
126 | * At this point 'pvt' (like dev_inst,dev_blk and dev_attrib) | 121 | * At this point 'pvt' (like dev_inst,dev_blk and dev_attrib) |