/alps/pcitool

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to register.c

  • Committer: Suren A. Chilingaryan
  • Date: 2011-12-06 09:39:23 UTC
  • Revision ID: csa@dside.dyndns.org-20111206093923-rxhxp8siwoa2t176
Fix multiword register reads in a proper way

Show diffs side-by-side

added added

removed removed

Lines of Context:
141
141
    
142
142
    pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
143
143
    pcilib_register_bank_description_t *b = model_info->banks + bank;
 
144
    
 
145
    int access = b->access / 8;
144
146
 
145
147
    assert(bits < 8 * sizeof(pcilib_register_value_t));
146
148
    
162
164
    //bits %= b->access; 
163
165
    
164
166
    for (i = 0; i < n; i++) {
165
 
        err = pcilib_protocol[b->protocol].read(ctx, b, addr + i, buf + i);
 
167
        err = pcilib_protocol[b->protocol].read(ctx, b, addr + i * access, buf + i);
166
168
        if (err) break;
167
169
    }
168
170
    
169
171
    if ((bits > 0)&&(!err)) {
170
172
        pcilib_register_value_t val = 0;
171
 
        err = pcilib_protocol[b->protocol].read(ctx, b, addr + n, &val);
 
173
        err = pcilib_protocol[b->protocol].read(ctx, b, addr + n * access, &val);
172
174
 
173
175
        val = (val >> offset)&BIT_MASK(bits);
174
176
        memcpy(buf + n, &val, sizeof(pcilib_register_value_t));
250
252
    pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
251
253
    pcilib_register_bank_description_t *b = model_info->banks + bank;
252
254
 
 
255
    int access = b->access / 8;
 
256
 
253
257
    assert(bits < 8 * sizeof(pcilib_register_value_t));
254
258
 
255
259
    if (((addr + n) > b->size)||(((addr + n) == b->size)&&(bits))) {
270
274
    //bits %= b->access; 
271
275
    
272
276
    for (i = 0; i < n; i++) {
273
 
        err = pcilib_protocol[b->protocol].write(ctx, b, addr + i, buf[i]);
 
277
        err = pcilib_protocol[b->protocol].write(ctx, b, addr + i * access, buf[i]);
274
278
        if (err) break;
275
279
    }
276
280
    
281
285
        if (~mask&rwmask) {
282
286
            pcilib_register_value_t rval;
283
287
            
284
 
            err = pcilib_protocol[b->protocol].read(ctx, b, addr + n, &rval); 
 
288
            err = pcilib_protocol[b->protocol].read(ctx, b, addr + n * access, &rval); 
285
289
            if (err) return err;
286
290
            
287
291
            val |= (rval & rwmask & ~mask);
288
292
        }
289
293
        
290
 
        err = pcilib_protocol[b->protocol].write(ctx, b, addr + n, val);
 
294
        err = pcilib_protocol[b->protocol].write(ctx, b, addr + n * access, val);
291
295
    }
292
296
    
293
297
    return err;