268 emii, data));
269 }
270
271 /*
272 * Atomically shift a 32-bit word left, returning
273 * the value it had *before* the shift was applied
274 */
275 static uint32_t rge_atomic_shl32(uint32_t *sp, uint_t count);
276 #pragma inline(rge_mii_put16)
277
278 static uint32_t
279 rge_atomic_shl32(uint32_t *sp, uint_t count)
280 {
281 uint32_t oldval;
282 uint32_t newval;
283
284 /* ATOMICALLY */
285 do {
286 oldval = *sp;
287 newval = oldval << count;
288 } while (cas32(sp, oldval, newval) != oldval);
289
290 return (oldval);
291 }
292
293 /*
294 * PHY operation routines
295 */
296 #if RGE_DEBUGGING
297
298 void
299 rge_phydump(rge_t *rgep)
300 {
301 uint16_t regs[32];
302 int i;
303
304 ASSERT(mutex_owned(rgep->genlock));
305
306 for (i = 0; i < 32; ++i) {
307 regs[i] = rge_mii_get16(rgep, i);
308 }
|
268 emii, data));
269 }
270
271 /*
272 * Atomically shift a 32-bit word left, returning
273 * the value it had *before* the shift was applied
274 */
275 static uint32_t rge_atomic_shl32(uint32_t *sp, uint_t count);
276 #pragma inline(rge_mii_put16)
277
278 static uint32_t
279 rge_atomic_shl32(uint32_t *sp, uint_t count)
280 {
281 uint32_t oldval;
282 uint32_t newval;
283
284 /* ATOMICALLY */
285 do {
286 oldval = *sp;
287 newval = oldval << count;
288 } while (atomic_cas_32(sp, oldval, newval) != oldval);
289
290 return (oldval);
291 }
292
293 /*
294 * PHY operation routines
295 */
296 #if RGE_DEBUGGING
297
298 void
299 rge_phydump(rge_t *rgep)
300 {
301 uint16_t regs[32];
302 int i;
303
304 ASSERT(mutex_owned(rgep->genlock));
305
306 for (i = 0; i < 32; ++i) {
307 regs[i] = rge_mii_get16(rgep, i);
308 }
|