Revision 546921ea hw/net/xgmac.c
b/hw/net/xgmac.c | ||
---|---|---|
135 | 135 |
uint64_t rx_mcast; |
136 | 136 |
} RxTxStats; |
137 | 137 |
|
138 |
#define TYPE_XGMAC "xgmac" |
|
139 |
#define XGMAC(obj) OBJECT_CHECK(XgmacState, (obj), TYPE_XGMAC) |
|
140 |
|
|
138 | 141 |
typedef struct XgmacState { |
139 |
SysBusDevice busdev; |
|
142 |
SysBusDevice parent_obj; |
|
143 |
|
|
140 | 144 |
MemoryRegion iomem; |
141 | 145 |
qemu_irq sbd_irq; |
142 | 146 |
qemu_irq pmt_irq; |
... | ... | |
173 | 177 |
} |
174 | 178 |
}; |
175 | 179 |
|
176 |
static void xgmac_read_desc(struct XgmacState *s, struct desc *d, int rx)
|
|
180 |
static void xgmac_read_desc(XgmacState *s, struct desc *d, int rx) |
|
177 | 181 |
{ |
178 | 182 |
uint32_t addr = rx ? s->regs[DMA_CUR_RX_DESC_ADDR] : |
179 | 183 |
s->regs[DMA_CUR_TX_DESC_ADDR]; |
180 | 184 |
cpu_physical_memory_read(addr, d, sizeof(*d)); |
181 | 185 |
} |
182 | 186 |
|
183 |
static void xgmac_write_desc(struct XgmacState *s, struct desc *d, int rx)
|
|
187 |
static void xgmac_write_desc(XgmacState *s, struct desc *d, int rx) |
|
184 | 188 |
{ |
185 | 189 |
int reg = rx ? DMA_CUR_RX_DESC_ADDR : DMA_CUR_TX_DESC_ADDR; |
186 | 190 |
uint32_t addr = s->regs[reg]; |
... | ... | |
195 | 199 |
cpu_physical_memory_write(addr, d, sizeof(*d)); |
196 | 200 |
} |
197 | 201 |
|
198 |
static void xgmac_enet_send(struct XgmacState *s)
|
|
202 |
static void xgmac_enet_send(XgmacState *s) |
|
199 | 203 |
{ |
200 | 204 |
struct desc bd; |
201 | 205 |
int frame_size; |
... | ... | |
246 | 250 |
} |
247 | 251 |
} |
248 | 252 |
|
249 |
static void enet_update_irq(struct XgmacState *s)
|
|
253 |
static void enet_update_irq(XgmacState *s) |
|
250 | 254 |
{ |
251 | 255 |
int stat = s->regs[DMA_STATUS] & s->regs[DMA_INTR_ENA]; |
252 | 256 |
qemu_set_irq(s->sbd_irq, !!stat); |
... | ... | |
254 | 258 |
|
255 | 259 |
static uint64_t enet_read(void *opaque, hwaddr addr, unsigned size) |
256 | 260 |
{ |
257 |
struct XgmacState *s = opaque;
|
|
261 |
XgmacState *s = opaque; |
|
258 | 262 |
uint64_t r = 0; |
259 | 263 |
addr >>= 2; |
260 | 264 |
|
... | ... | |
274 | 278 |
static void enet_write(void *opaque, hwaddr addr, |
275 | 279 |
uint64_t value, unsigned size) |
276 | 280 |
{ |
277 |
struct XgmacState *s = opaque;
|
|
281 |
XgmacState *s = opaque; |
|
278 | 282 |
|
279 | 283 |
addr >>= 2; |
280 | 284 |
switch (addr) { |
... | ... | |
310 | 314 |
|
311 | 315 |
static int eth_can_rx(NetClientState *nc) |
312 | 316 |
{ |
313 |
struct XgmacState *s = qemu_get_nic_opaque(nc);
|
|
317 |
XgmacState *s = qemu_get_nic_opaque(nc); |
|
314 | 318 |
|
315 | 319 |
/* RX enabled? */ |
316 | 320 |
return s->regs[DMA_CONTROL] & DMA_CONTROL_SR; |
... | ... | |
318 | 322 |
|
319 | 323 |
static ssize_t eth_rx(NetClientState *nc, const uint8_t *buf, size_t size) |
320 | 324 |
{ |
321 |
struct XgmacState *s = qemu_get_nic_opaque(nc);
|
|
325 |
XgmacState *s = qemu_get_nic_opaque(nc); |
|
322 | 326 |
static const unsigned char sa_bcast[6] = {0xff, 0xff, 0xff, |
323 | 327 |
0xff, 0xff, 0xff}; |
324 | 328 |
int unicast, broadcast, multicast; |
... | ... | |
366 | 370 |
|
367 | 371 |
static void eth_cleanup(NetClientState *nc) |
368 | 372 |
{ |
369 |
struct XgmacState *s = qemu_get_nic_opaque(nc); |
|
373 |
XgmacState *s = qemu_get_nic_opaque(nc); |
|
374 |
|
|
370 | 375 |
s->nic = NULL; |
371 | 376 |
} |
372 | 377 |
|
... | ... | |
378 | 383 |
.cleanup = eth_cleanup, |
379 | 384 |
}; |
380 | 385 |
|
381 |
static int xgmac_enet_init(SysBusDevice *dev)
|
|
386 |
static int xgmac_enet_init(SysBusDevice *sbd)
|
|
382 | 387 |
{ |
383 |
struct XgmacState *s = FROM_SYSBUS(typeof(*s), dev); |
|
388 |
DeviceState *dev = DEVICE(sbd); |
|
389 |
XgmacState *s = XGMAC(dev); |
|
384 | 390 |
|
385 | 391 |
memory_region_init_io(&s->iomem, OBJECT(s), &enet_mem_ops, s, |
386 | 392 |
"xgmac", 0x1000); |
387 |
sysbus_init_mmio(dev, &s->iomem);
|
|
388 |
sysbus_init_irq(dev, &s->sbd_irq);
|
|
389 |
sysbus_init_irq(dev, &s->pmt_irq);
|
|
390 |
sysbus_init_irq(dev, &s->mci_irq);
|
|
393 |
sysbus_init_mmio(sbd, &s->iomem);
|
|
394 |
sysbus_init_irq(sbd, &s->sbd_irq);
|
|
395 |
sysbus_init_irq(sbd, &s->pmt_irq);
|
|
396 |
sysbus_init_irq(sbd, &s->mci_irq);
|
|
391 | 397 |
|
392 | 398 |
qemu_macaddr_default_if_unset(&s->conf.macaddr); |
393 | 399 |
s->nic = qemu_new_nic(&net_xgmac_enet_info, &s->conf, |
394 |
object_get_typename(OBJECT(dev)), dev->qdev.id, s);
|
|
400 |
object_get_typename(OBJECT(dev)), dev->id, s); |
|
395 | 401 |
qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a); |
396 | 402 |
|
397 | 403 |
s->regs[XGMAC_ADDR_HIGH(0)] = (s->conf.macaddr.a[5] << 8) | |
... | ... | |
405 | 411 |
} |
406 | 412 |
|
407 | 413 |
static Property xgmac_properties[] = { |
408 |
DEFINE_NIC_PROPERTIES(struct XgmacState, conf),
|
|
414 |
DEFINE_NIC_PROPERTIES(XgmacState, conf), |
|
409 | 415 |
DEFINE_PROP_END_OF_LIST(), |
410 | 416 |
}; |
411 | 417 |
|
... | ... | |
420 | 426 |
} |
421 | 427 |
|
422 | 428 |
static const TypeInfo xgmac_enet_info = { |
423 |
.name = "xgmac",
|
|
429 |
.name = TYPE_XGMAC,
|
|
424 | 430 |
.parent = TYPE_SYS_BUS_DEVICE, |
425 |
.instance_size = sizeof(struct XgmacState),
|
|
431 |
.instance_size = sizeof(XgmacState), |
|
426 | 432 |
.class_init = xgmac_enet_class_init, |
427 | 433 |
}; |
428 | 434 |
|
Also available in: Unified diff