i8254xGBe.cc (12963:214e39f63149) | i8254xGBe.cc (13342:1ddb43f47325) |
---|---|
1/* 2 * Copyright (c) 2006 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 180 unchanged lines hidden (view full) --- 189 190 // 191 // Handle read of register here 192 // 193 194 195 switch (daddr) { 196 case REG_CTRL: | 1/* 2 * Copyright (c) 2006 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 180 unchanged lines hidden (view full) --- 189 190 // 191 // Handle read of register here 192 // 193 194 195 switch (daddr) { 196 case REG_CTRL: |
197 pkt->set | 197 pkt->setLE<uint32_t>(regs.ctrl()); |
198 break; 199 case REG_STATUS: | 198 break; 199 case REG_STATUS: |
200 pkt->set | 200 pkt->setLE<uint32_t>(regs.sts()); |
201 break; 202 case REG_EECD: | 201 break; 202 case REG_EECD: |
203 pkt->set | 203 pkt->setLE<uint32_t>(regs.eecd()); |
204 break; 205 case REG_EERD: | 204 break; 205 case REG_EERD: |
206 pkt->set | 206 pkt->setLE<uint32_t>(regs.eerd()); |
207 break; 208 case REG_CTRL_EXT: | 207 break; 208 case REG_CTRL_EXT: |
209 pkt->set | 209 pkt->setLE<uint32_t>(regs.ctrl_ext()); |
210 break; 211 case REG_MDIC: | 210 break; 211 case REG_MDIC: |
212 pkt->set | 212 pkt->setLE<uint32_t>(regs.mdic()); |
213 break; 214 case REG_ICR: 215 DPRINTF(Ethernet, "Reading ICR. ICR=%#x IMR=%#x IAM=%#x IAME=%d\n", 216 regs.icr(), regs.imr, regs.iam, regs.ctrl_ext.iame()); | 213 break; 214 case REG_ICR: 215 DPRINTF(Ethernet, "Reading ICR. ICR=%#x IMR=%#x IAM=%#x IAME=%d\n", 216 regs.icr(), regs.imr, regs.iam, regs.ctrl_ext.iame()); |
217 pkt->set | 217 pkt->setLE<uint32_t>(regs.icr()); |
218 if (regs.icr.int_assert() || regs.imr == 0) { 219 regs.icr = regs.icr() & ~mask(30); 220 DPRINTF(Ethernet, "Cleared ICR. ICR=%#x\n", regs.icr()); 221 } 222 if (regs.ctrl_ext.iame() && regs.icr.int_assert()) 223 regs.imr &= ~regs.iam; 224 chkInterrupt(); 225 break; 226 case REG_EICR: 227 // This is only useful for MSI, but the driver reads it every time 228 // Just don't do anything | 218 if (regs.icr.int_assert() || regs.imr == 0) { 219 regs.icr = regs.icr() & ~mask(30); 220 DPRINTF(Ethernet, "Cleared ICR. ICR=%#x\n", regs.icr()); 221 } 222 if (regs.ctrl_ext.iame() && regs.icr.int_assert()) 223 regs.imr &= ~regs.iam; 224 chkInterrupt(); 225 break; 226 case REG_EICR: 227 // This is only useful for MSI, but the driver reads it every time 228 // Just don't do anything |
229 pkt->set | 229 pkt->setLE<uint32_t>(0); |
230 break; 231 case REG_ITR: | 230 break; 231 case REG_ITR: |
232 pkt->set | 232 pkt->setLE<uint32_t>(regs.itr()); |
233 break; 234 case REG_RCTL: | 233 break; 234 case REG_RCTL: |
235 pkt->set | 235 pkt->setLE<uint32_t>(regs.rctl()); |
236 break; 237 case REG_FCTTV: | 236 break; 237 case REG_FCTTV: |
238 pkt->set | 238 pkt->setLE<uint32_t>(regs.fcttv()); |
239 break; 240 case REG_TCTL: | 239 break; 240 case REG_TCTL: |
241 pkt->set | 241 pkt->setLE<uint32_t>(regs.tctl()); |
242 break; 243 case REG_PBA: | 242 break; 243 case REG_PBA: |
244 pkt->set | 244 pkt->setLE<uint32_t>(regs.pba()); |
245 break; 246 case REG_WUC: 247 case REG_WUFC: 248 case REG_WUS: 249 case REG_LEDCTL: | 245 break; 246 case REG_WUC: 247 case REG_WUFC: 248 case REG_WUS: 249 case REG_LEDCTL: |
250 pkt->set | 250 pkt->setLE<uint32_t>(0); // We don't care, so just return 0 |
251 break; 252 case REG_FCRTL: | 251 break; 252 case REG_FCRTL: |
253 pkt->set | 253 pkt->setLE<uint32_t>(regs.fcrtl()); |
254 break; 255 case REG_FCRTH: | 254 break; 255 case REG_FCRTH: |
256 pkt->set | 256 pkt->setLE<uint32_t>(regs.fcrth()); |
257 break; 258 case REG_RDBAL: | 257 break; 258 case REG_RDBAL: |
259 pkt->set | 259 pkt->setLE<uint32_t>(regs.rdba.rdbal()); |
260 break; 261 case REG_RDBAH: | 260 break; 261 case REG_RDBAH: |
262 pkt->set | 262 pkt->setLE<uint32_t>(regs.rdba.rdbah()); |
263 break; 264 case REG_RDLEN: | 263 break; 264 case REG_RDLEN: |
265 pkt->set | 265 pkt->setLE<uint32_t>(regs.rdlen()); |
266 break; 267 case REG_SRRCTL: | 266 break; 267 case REG_SRRCTL: |
268 pkt->set | 268 pkt->setLE<uint32_t>(regs.srrctl()); |
269 break; 270 case REG_RDH: | 269 break; 270 case REG_RDH: |
271 pkt->set | 271 pkt->setLE<uint32_t>(regs.rdh()); |
272 break; 273 case REG_RDT: | 272 break; 273 case REG_RDT: |
274 pkt->set | 274 pkt->setLE<uint32_t>(regs.rdt()); |
275 break; 276 case REG_RDTR: | 275 break; 276 case REG_RDTR: |
277 pkt->set | 277 pkt->setLE<uint32_t>(regs.rdtr()); |
278 if (regs.rdtr.fpd()) { 279 rxDescCache.writeback(0); 280 DPRINTF(EthernetIntr, 281 "Posting interrupt because of RDTR.FPD write\n"); 282 postInterrupt(IT_RXT); 283 regs.rdtr.fpd(0); 284 } 285 break; 286 case REG_RXDCTL: | 278 if (regs.rdtr.fpd()) { 279 rxDescCache.writeback(0); 280 DPRINTF(EthernetIntr, 281 "Posting interrupt because of RDTR.FPD write\n"); 282 postInterrupt(IT_RXT); 283 regs.rdtr.fpd(0); 284 } 285 break; 286 case REG_RXDCTL: |
287 pkt->set | 287 pkt->setLE<uint32_t>(regs.rxdctl()); |
288 break; 289 case REG_RADV: | 288 break; 289 case REG_RADV: |
290 pkt->set | 290 pkt->setLE<uint32_t>(regs.radv()); |
291 break; 292 case REG_TDBAL: | 291 break; 292 case REG_TDBAL: |
293 pkt->set | 293 pkt->setLE<uint32_t>(regs.tdba.tdbal()); |
294 break; 295 case REG_TDBAH: | 294 break; 295 case REG_TDBAH: |
296 pkt->set | 296 pkt->setLE<uint32_t>(regs.tdba.tdbah()); |
297 break; 298 case REG_TDLEN: | 297 break; 298 case REG_TDLEN: |
299 pkt->set | 299 pkt->setLE<uint32_t>(regs.tdlen()); |
300 break; 301 case REG_TDH: | 300 break; 301 case REG_TDH: |
302 pkt->set | 302 pkt->setLE<uint32_t>(regs.tdh()); |
303 break; 304 case REG_TXDCA_CTL: | 303 break; 304 case REG_TXDCA_CTL: |
305 pkt->set | 305 pkt->setLE<uint32_t>(regs.txdca_ctl()); |
306 break; 307 case REG_TDT: | 306 break; 307 case REG_TDT: |
308 pkt->set | 308 pkt->setLE<uint32_t>(regs.tdt()); |
309 break; 310 case REG_TIDV: | 309 break; 310 case REG_TIDV: |
311 pkt->set | 311 pkt->setLE<uint32_t>(regs.tidv()); |
312 break; 313 case REG_TXDCTL: | 312 break; 313 case REG_TXDCTL: |
314 pkt->set | 314 pkt->setLE<uint32_t>(regs.txdctl()); |
315 break; 316 case REG_TADV: | 315 break; 316 case REG_TADV: |
317 pkt->set | 317 pkt->setLE<uint32_t>(regs.tadv()); |
318 break; 319 case REG_TDWBAL: | 318 break; 319 case REG_TDWBAL: |
320 pkt->set | 320 pkt->setLE<uint32_t>(regs.tdwba & mask(32)); |
321 break; 322 case REG_TDWBAH: | 321 break; 322 case REG_TDWBAH: |
323 pkt->set | 323 pkt->setLE<uint32_t>(regs.tdwba >> 32); |
324 break; 325 case REG_RXCSUM: | 324 break; 325 case REG_RXCSUM: |
326 pkt->set | 326 pkt->setLE<uint32_t>(regs.rxcsum()); |
327 break; 328 case REG_RLPML: | 327 break; 328 case REG_RLPML: |
329 pkt->set | 329 pkt->setLE<uint32_t>(regs.rlpml); |
330 break; 331 case REG_RFCTL: | 330 break; 331 case REG_RFCTL: |
332 pkt->set | 332 pkt->setLE<uint32_t>(regs.rfctl()); |
333 break; 334 case REG_MANC: | 333 break; 334 case REG_MANC: |
335 pkt->set | 335 pkt->setLE<uint32_t>(regs.manc()); |
336 break; 337 case REG_SWSM: | 336 break; 337 case REG_SWSM: |
338 pkt->set | 338 pkt->setLE<uint32_t>(regs.swsm()); |
339 regs.swsm.smbi(1); 340 break; 341 case REG_FWSM: | 339 regs.swsm.smbi(1); 340 break; 341 case REG_FWSM: |
342 pkt->set | 342 pkt->setLE<uint32_t>(regs.fwsm()); |
343 break; 344 case REG_SWFWSYNC: | 343 break; 344 case REG_SWFWSYNC: |
345 pkt->set | 345 pkt->setLE<uint32_t>(regs.sw_fw_sync); |
346 break; 347 default: 348 if (!IN_RANGE(daddr, REG_VFTA, VLAN_FILTER_TABLE_SIZE*4) && 349 !IN_RANGE(daddr, REG_RAL, RCV_ADDRESS_TABLE_SIZE*8) && 350 !IN_RANGE(daddr, REG_MTA, MULTICAST_TABLE_SIZE*4) && 351 !IN_RANGE(daddr, REG_CRCERRS, STATS_REGS_SIZE)) 352 panic("Read request to unknown register number: %#x\n", daddr); 353 else | 346 break; 347 default: 348 if (!IN_RANGE(daddr, REG_VFTA, VLAN_FILTER_TABLE_SIZE*4) && 349 !IN_RANGE(daddr, REG_RAL, RCV_ADDRESS_TABLE_SIZE*8) && 350 !IN_RANGE(daddr, REG_MTA, MULTICAST_TABLE_SIZE*4) && 351 !IN_RANGE(daddr, REG_CRCERRS, STATS_REGS_SIZE)) 352 panic("Read request to unknown register number: %#x\n", daddr); 353 else |
354 pkt->set | 354 pkt->setLE<uint32_t>(0); |
355 }; 356 357 pkt->makeAtomicResponse(); 358 return pioDelay; 359} 360 361Tick 362IGbE::write(PacketPtr pkt) --- 7 unchanged lines hidden (view full) --- 370 371 // Only Memory register BAR is allowed 372 assert(bar == 0); 373 374 // Only 32bit accesses allowed 375 assert(pkt->getSize() == sizeof(uint32_t)); 376 377 DPRINTF(Ethernet, "Wrote device register %#X value %#X\n", | 355 }; 356 357 pkt->makeAtomicResponse(); 358 return pioDelay; 359} 360 361Tick 362IGbE::write(PacketPtr pkt) --- 7 unchanged lines hidden (view full) --- 370 371 // Only Memory register BAR is allowed 372 assert(bar == 0); 373 374 // Only 32bit accesses allowed 375 assert(pkt->getSize() == sizeof(uint32_t)); 376 377 DPRINTF(Ethernet, "Wrote device register %#X value %#X\n", |
378 daddr, pkt->get | 378 daddr, pkt->getLE<uint32_t>()); |
379 380 // 381 // Handle write of register here 382 // | 379 380 // 381 // Handle write of register here 382 // |
383 uint32_t val = pkt->get | 383 uint32_t val = pkt->getLE<uint32_t>(); |
384 385 Regs::RCTL oldrctl; 386 Regs::TCTL oldtctl; 387 388 switch (daddr) { 389 case REG_CTRL: 390 regs.ctrl = val; 391 if (regs.ctrl.tfce()) --- 2202 unchanged lines hidden --- | 384 385 Regs::RCTL oldrctl; 386 Regs::TCTL oldtctl; 387 388 switch (daddr) { 389 case REG_CTRL: 390 regs.ctrl = val; 391 if (regs.ctrl.tfce()) --- 2202 unchanged lines hidden --- |