1*01c966b5SDoug Evans /* 2*01c966b5SDoug Evans * Nuvoton NPCM7xx EMC Module 3*01c966b5SDoug Evans * 4*01c966b5SDoug Evans * Copyright 2020 Google LLC 5*01c966b5SDoug Evans * 6*01c966b5SDoug Evans * This program is free software; you can redistribute it and/or modify it 7*01c966b5SDoug Evans * under the terms of the GNU General Public License as published by the 8*01c966b5SDoug Evans * Free Software Foundation; either version 2 of the License, or 9*01c966b5SDoug Evans * (at your option) any later version. 10*01c966b5SDoug Evans * 11*01c966b5SDoug Evans * This program is distributed in the hope that it will be useful, but WITHOUT 12*01c966b5SDoug Evans * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*01c966b5SDoug Evans * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*01c966b5SDoug Evans * for more details. 15*01c966b5SDoug Evans * 16*01c966b5SDoug Evans * Unsupported/unimplemented features: 17*01c966b5SDoug Evans * - MCMDR.FDUP (full duplex) is ignored, half duplex is not supported 18*01c966b5SDoug Evans * - Only CAM0 is supported, CAM[1-15] are not 19*01c966b5SDoug Evans * - writes to CAMEN.[1-15] are ignored, these bits always read as zeroes 20*01c966b5SDoug Evans * - MII is not implemented, MIIDA.BUSY and MIID always return zero 21*01c966b5SDoug Evans * - MCMDR.LBK is not implemented 22*01c966b5SDoug Evans * - MCMDR.{OPMOD,ENSQE,AEP,ARP} are not supported 23*01c966b5SDoug Evans * - H/W FIFOs are not supported, MCMDR.FFTCR is ignored 24*01c966b5SDoug Evans * - MGSTA.SQE is not supported 25*01c966b5SDoug Evans * - pause and control frames are not implemented 26*01c966b5SDoug Evans * - MGSTA.CCNT is not supported 27*01c966b5SDoug Evans * - MPCNT, DMARFS are not implemented 28*01c966b5SDoug Evans */ 29*01c966b5SDoug Evans 30*01c966b5SDoug Evans #include "qemu/osdep.h" 31*01c966b5SDoug Evans 32*01c966b5SDoug Evans /* For crc32 */ 33*01c966b5SDoug Evans #include <zlib.h> 34*01c966b5SDoug Evans 35*01c966b5SDoug Evans #include "qemu-common.h" 36*01c966b5SDoug Evans #include "hw/irq.h" 37*01c966b5SDoug Evans #include "hw/qdev-clock.h" 38*01c966b5SDoug Evans #include "hw/qdev-properties.h" 39*01c966b5SDoug Evans #include "hw/net/npcm7xx_emc.h" 40*01c966b5SDoug Evans #include "net/eth.h" 41*01c966b5SDoug Evans #include "migration/vmstate.h" 42*01c966b5SDoug Evans #include "qemu/bitops.h" 43*01c966b5SDoug Evans #include "qemu/error-report.h" 44*01c966b5SDoug Evans #include "qemu/log.h" 45*01c966b5SDoug Evans #include "qemu/module.h" 46*01c966b5SDoug Evans #include "qemu/units.h" 47*01c966b5SDoug Evans #include "sysemu/dma.h" 48*01c966b5SDoug Evans #include "trace.h" 49*01c966b5SDoug Evans 50*01c966b5SDoug Evans #define CRC_LENGTH 4 51*01c966b5SDoug Evans 52*01c966b5SDoug Evans /* 53*01c966b5SDoug Evans * The maximum size of a (layer 2) ethernet frame as defined by 802.3. 54*01c966b5SDoug Evans * 1518 = 6(dest macaddr) + 6(src macaddr) + 2(proto) + 4(crc) + 1500(payload) 55*01c966b5SDoug Evans * This does not include an additional 4 for the vlan field (802.1q). 56*01c966b5SDoug Evans */ 57*01c966b5SDoug Evans #define MAX_ETH_FRAME_SIZE 1518 58*01c966b5SDoug Evans 59*01c966b5SDoug Evans static const char *emc_reg_name(int regno) 60*01c966b5SDoug Evans { 61*01c966b5SDoug Evans #define REG(name) case REG_ ## name: return #name; 62*01c966b5SDoug Evans switch (regno) { 63*01c966b5SDoug Evans REG(CAMCMR) 64*01c966b5SDoug Evans REG(CAMEN) 65*01c966b5SDoug Evans REG(TXDLSA) 66*01c966b5SDoug Evans REG(RXDLSA) 67*01c966b5SDoug Evans REG(MCMDR) 68*01c966b5SDoug Evans REG(MIID) 69*01c966b5SDoug Evans REG(MIIDA) 70*01c966b5SDoug Evans REG(FFTCR) 71*01c966b5SDoug Evans REG(TSDR) 72*01c966b5SDoug Evans REG(RSDR) 73*01c966b5SDoug Evans REG(DMARFC) 74*01c966b5SDoug Evans REG(MIEN) 75*01c966b5SDoug Evans REG(MISTA) 76*01c966b5SDoug Evans REG(MGSTA) 77*01c966b5SDoug Evans REG(MPCNT) 78*01c966b5SDoug Evans REG(MRPC) 79*01c966b5SDoug Evans REG(MRPCC) 80*01c966b5SDoug Evans REG(MREPC) 81*01c966b5SDoug Evans REG(DMARFS) 82*01c966b5SDoug Evans REG(CTXDSA) 83*01c966b5SDoug Evans REG(CTXBSA) 84*01c966b5SDoug Evans REG(CRXDSA) 85*01c966b5SDoug Evans REG(CRXBSA) 86*01c966b5SDoug Evans case REG_CAMM_BASE + 0: return "CAM0M"; 87*01c966b5SDoug Evans case REG_CAML_BASE + 0: return "CAM0L"; 88*01c966b5SDoug Evans case REG_CAMM_BASE + 2 ... REG_CAMML_LAST: 89*01c966b5SDoug Evans /* Only CAM0 is supported, fold the others into something simple. */ 90*01c966b5SDoug Evans if (regno & 1) { 91*01c966b5SDoug Evans return "CAM<n>L"; 92*01c966b5SDoug Evans } else { 93*01c966b5SDoug Evans return "CAM<n>M"; 94*01c966b5SDoug Evans } 95*01c966b5SDoug Evans default: return "UNKNOWN"; 96*01c966b5SDoug Evans } 97*01c966b5SDoug Evans #undef REG 98*01c966b5SDoug Evans } 99*01c966b5SDoug Evans 100*01c966b5SDoug Evans static void emc_reset(NPCM7xxEMCState *emc) 101*01c966b5SDoug Evans { 102*01c966b5SDoug Evans trace_npcm7xx_emc_reset(emc->emc_num); 103*01c966b5SDoug Evans 104*01c966b5SDoug Evans memset(&emc->regs[0], 0, sizeof(emc->regs)); 105*01c966b5SDoug Evans 106*01c966b5SDoug Evans /* These regs have non-zero reset values. */ 107*01c966b5SDoug Evans emc->regs[REG_TXDLSA] = 0xfffffffc; 108*01c966b5SDoug Evans emc->regs[REG_RXDLSA] = 0xfffffffc; 109*01c966b5SDoug Evans emc->regs[REG_MIIDA] = 0x00900000; 110*01c966b5SDoug Evans emc->regs[REG_FFTCR] = 0x0101; 111*01c966b5SDoug Evans emc->regs[REG_DMARFC] = 0x0800; 112*01c966b5SDoug Evans emc->regs[REG_MPCNT] = 0x7fff; 113*01c966b5SDoug Evans 114*01c966b5SDoug Evans emc->tx_active = false; 115*01c966b5SDoug Evans emc->rx_active = false; 116*01c966b5SDoug Evans } 117*01c966b5SDoug Evans 118*01c966b5SDoug Evans static void npcm7xx_emc_reset(DeviceState *dev) 119*01c966b5SDoug Evans { 120*01c966b5SDoug Evans NPCM7xxEMCState *emc = NPCM7XX_EMC(dev); 121*01c966b5SDoug Evans emc_reset(emc); 122*01c966b5SDoug Evans } 123*01c966b5SDoug Evans 124*01c966b5SDoug Evans static void emc_soft_reset(NPCM7xxEMCState *emc) 125*01c966b5SDoug Evans { 126*01c966b5SDoug Evans /* 127*01c966b5SDoug Evans * The docs say at least MCMDR.{LBK,OPMOD} bits are not changed during a 128*01c966b5SDoug Evans * soft reset, but does not go into further detail. For now, KISS. 129*01c966b5SDoug Evans */ 130*01c966b5SDoug Evans uint32_t mcmdr = emc->regs[REG_MCMDR]; 131*01c966b5SDoug Evans emc_reset(emc); 132*01c966b5SDoug Evans emc->regs[REG_MCMDR] = mcmdr & (REG_MCMDR_LBK | REG_MCMDR_OPMOD); 133*01c966b5SDoug Evans 134*01c966b5SDoug Evans qemu_set_irq(emc->tx_irq, 0); 135*01c966b5SDoug Evans qemu_set_irq(emc->rx_irq, 0); 136*01c966b5SDoug Evans } 137*01c966b5SDoug Evans 138*01c966b5SDoug Evans static void emc_set_link(NetClientState *nc) 139*01c966b5SDoug Evans { 140*01c966b5SDoug Evans /* Nothing to do yet. */ 141*01c966b5SDoug Evans } 142*01c966b5SDoug Evans 143*01c966b5SDoug Evans /* MISTA.TXINTR is the union of the individual bits with their enables. */ 144*01c966b5SDoug Evans static void emc_update_mista_txintr(NPCM7xxEMCState *emc) 145*01c966b5SDoug Evans { 146*01c966b5SDoug Evans /* Only look at the bits we support. */ 147*01c966b5SDoug Evans uint32_t mask = (REG_MISTA_TXBERR | 148*01c966b5SDoug Evans REG_MISTA_TDU | 149*01c966b5SDoug Evans REG_MISTA_TXCP); 150*01c966b5SDoug Evans if (emc->regs[REG_MISTA] & emc->regs[REG_MIEN] & mask) { 151*01c966b5SDoug Evans emc->regs[REG_MISTA] |= REG_MISTA_TXINTR; 152*01c966b5SDoug Evans } else { 153*01c966b5SDoug Evans emc->regs[REG_MISTA] &= ~REG_MISTA_TXINTR; 154*01c966b5SDoug Evans } 155*01c966b5SDoug Evans } 156*01c966b5SDoug Evans 157*01c966b5SDoug Evans /* MISTA.RXINTR is the union of the individual bits with their enables. */ 158*01c966b5SDoug Evans static void emc_update_mista_rxintr(NPCM7xxEMCState *emc) 159*01c966b5SDoug Evans { 160*01c966b5SDoug Evans /* Only look at the bits we support. */ 161*01c966b5SDoug Evans uint32_t mask = (REG_MISTA_RXBERR | 162*01c966b5SDoug Evans REG_MISTA_RDU | 163*01c966b5SDoug Evans REG_MISTA_RXGD); 164*01c966b5SDoug Evans if (emc->regs[REG_MISTA] & emc->regs[REG_MIEN] & mask) { 165*01c966b5SDoug Evans emc->regs[REG_MISTA] |= REG_MISTA_RXINTR; 166*01c966b5SDoug Evans } else { 167*01c966b5SDoug Evans emc->regs[REG_MISTA] &= ~REG_MISTA_RXINTR; 168*01c966b5SDoug Evans } 169*01c966b5SDoug Evans } 170*01c966b5SDoug Evans 171*01c966b5SDoug Evans /* N.B. emc_update_mista_txintr must have already been called. */ 172*01c966b5SDoug Evans static void emc_update_tx_irq(NPCM7xxEMCState *emc) 173*01c966b5SDoug Evans { 174*01c966b5SDoug Evans int level = !!(emc->regs[REG_MISTA] & 175*01c966b5SDoug Evans emc->regs[REG_MIEN] & 176*01c966b5SDoug Evans REG_MISTA_TXINTR); 177*01c966b5SDoug Evans trace_npcm7xx_emc_update_tx_irq(level); 178*01c966b5SDoug Evans qemu_set_irq(emc->tx_irq, level); 179*01c966b5SDoug Evans } 180*01c966b5SDoug Evans 181*01c966b5SDoug Evans /* N.B. emc_update_mista_rxintr must have already been called. */ 182*01c966b5SDoug Evans static void emc_update_rx_irq(NPCM7xxEMCState *emc) 183*01c966b5SDoug Evans { 184*01c966b5SDoug Evans int level = !!(emc->regs[REG_MISTA] & 185*01c966b5SDoug Evans emc->regs[REG_MIEN] & 186*01c966b5SDoug Evans REG_MISTA_RXINTR); 187*01c966b5SDoug Evans trace_npcm7xx_emc_update_rx_irq(level); 188*01c966b5SDoug Evans qemu_set_irq(emc->rx_irq, level); 189*01c966b5SDoug Evans } 190*01c966b5SDoug Evans 191*01c966b5SDoug Evans /* Update IRQ states due to changes in MIEN,MISTA. */ 192*01c966b5SDoug Evans static void emc_update_irq_from_reg_change(NPCM7xxEMCState *emc) 193*01c966b5SDoug Evans { 194*01c966b5SDoug Evans emc_update_mista_txintr(emc); 195*01c966b5SDoug Evans emc_update_tx_irq(emc); 196*01c966b5SDoug Evans 197*01c966b5SDoug Evans emc_update_mista_rxintr(emc); 198*01c966b5SDoug Evans emc_update_rx_irq(emc); 199*01c966b5SDoug Evans } 200*01c966b5SDoug Evans 201*01c966b5SDoug Evans static int emc_read_tx_desc(dma_addr_t addr, NPCM7xxEMCTxDesc *desc) 202*01c966b5SDoug Evans { 203*01c966b5SDoug Evans if (dma_memory_read(&address_space_memory, addr, desc, sizeof(*desc))) { 204*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to read descriptor @ 0x%" 205*01c966b5SDoug Evans HWADDR_PRIx "\n", __func__, addr); 206*01c966b5SDoug Evans return -1; 207*01c966b5SDoug Evans } 208*01c966b5SDoug Evans desc->flags = le32_to_cpu(desc->flags); 209*01c966b5SDoug Evans desc->txbsa = le32_to_cpu(desc->txbsa); 210*01c966b5SDoug Evans desc->status_and_length = le32_to_cpu(desc->status_and_length); 211*01c966b5SDoug Evans desc->ntxdsa = le32_to_cpu(desc->ntxdsa); 212*01c966b5SDoug Evans return 0; 213*01c966b5SDoug Evans } 214*01c966b5SDoug Evans 215*01c966b5SDoug Evans static int emc_write_tx_desc(const NPCM7xxEMCTxDesc *desc, dma_addr_t addr) 216*01c966b5SDoug Evans { 217*01c966b5SDoug Evans NPCM7xxEMCTxDesc le_desc; 218*01c966b5SDoug Evans 219*01c966b5SDoug Evans le_desc.flags = cpu_to_le32(desc->flags); 220*01c966b5SDoug Evans le_desc.txbsa = cpu_to_le32(desc->txbsa); 221*01c966b5SDoug Evans le_desc.status_and_length = cpu_to_le32(desc->status_and_length); 222*01c966b5SDoug Evans le_desc.ntxdsa = cpu_to_le32(desc->ntxdsa); 223*01c966b5SDoug Evans if (dma_memory_write(&address_space_memory, addr, &le_desc, 224*01c966b5SDoug Evans sizeof(le_desc))) { 225*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to write descriptor @ 0x%" 226*01c966b5SDoug Evans HWADDR_PRIx "\n", __func__, addr); 227*01c966b5SDoug Evans return -1; 228*01c966b5SDoug Evans } 229*01c966b5SDoug Evans return 0; 230*01c966b5SDoug Evans } 231*01c966b5SDoug Evans 232*01c966b5SDoug Evans static int emc_read_rx_desc(dma_addr_t addr, NPCM7xxEMCRxDesc *desc) 233*01c966b5SDoug Evans { 234*01c966b5SDoug Evans if (dma_memory_read(&address_space_memory, addr, desc, sizeof(*desc))) { 235*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to read descriptor @ 0x%" 236*01c966b5SDoug Evans HWADDR_PRIx "\n", __func__, addr); 237*01c966b5SDoug Evans return -1; 238*01c966b5SDoug Evans } 239*01c966b5SDoug Evans desc->status_and_length = le32_to_cpu(desc->status_and_length); 240*01c966b5SDoug Evans desc->rxbsa = le32_to_cpu(desc->rxbsa); 241*01c966b5SDoug Evans desc->reserved = le32_to_cpu(desc->reserved); 242*01c966b5SDoug Evans desc->nrxdsa = le32_to_cpu(desc->nrxdsa); 243*01c966b5SDoug Evans return 0; 244*01c966b5SDoug Evans } 245*01c966b5SDoug Evans 246*01c966b5SDoug Evans static int emc_write_rx_desc(const NPCM7xxEMCRxDesc *desc, dma_addr_t addr) 247*01c966b5SDoug Evans { 248*01c966b5SDoug Evans NPCM7xxEMCRxDesc le_desc; 249*01c966b5SDoug Evans 250*01c966b5SDoug Evans le_desc.status_and_length = cpu_to_le32(desc->status_and_length); 251*01c966b5SDoug Evans le_desc.rxbsa = cpu_to_le32(desc->rxbsa); 252*01c966b5SDoug Evans le_desc.reserved = cpu_to_le32(desc->reserved); 253*01c966b5SDoug Evans le_desc.nrxdsa = cpu_to_le32(desc->nrxdsa); 254*01c966b5SDoug Evans if (dma_memory_write(&address_space_memory, addr, &le_desc, 255*01c966b5SDoug Evans sizeof(le_desc))) { 256*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to write descriptor @ 0x%" 257*01c966b5SDoug Evans HWADDR_PRIx "\n", __func__, addr); 258*01c966b5SDoug Evans return -1; 259*01c966b5SDoug Evans } 260*01c966b5SDoug Evans return 0; 261*01c966b5SDoug Evans } 262*01c966b5SDoug Evans 263*01c966b5SDoug Evans static void emc_set_mista(NPCM7xxEMCState *emc, uint32_t flags) 264*01c966b5SDoug Evans { 265*01c966b5SDoug Evans trace_npcm7xx_emc_set_mista(flags); 266*01c966b5SDoug Evans emc->regs[REG_MISTA] |= flags; 267*01c966b5SDoug Evans if (extract32(flags, 16, 16)) { 268*01c966b5SDoug Evans emc_update_mista_txintr(emc); 269*01c966b5SDoug Evans } 270*01c966b5SDoug Evans if (extract32(flags, 0, 16)) { 271*01c966b5SDoug Evans emc_update_mista_rxintr(emc); 272*01c966b5SDoug Evans } 273*01c966b5SDoug Evans } 274*01c966b5SDoug Evans 275*01c966b5SDoug Evans static void emc_halt_tx(NPCM7xxEMCState *emc, uint32_t mista_flag) 276*01c966b5SDoug Evans { 277*01c966b5SDoug Evans emc->tx_active = false; 278*01c966b5SDoug Evans emc_set_mista(emc, mista_flag); 279*01c966b5SDoug Evans } 280*01c966b5SDoug Evans 281*01c966b5SDoug Evans static void emc_halt_rx(NPCM7xxEMCState *emc, uint32_t mista_flag) 282*01c966b5SDoug Evans { 283*01c966b5SDoug Evans emc->rx_active = false; 284*01c966b5SDoug Evans emc_set_mista(emc, mista_flag); 285*01c966b5SDoug Evans } 286*01c966b5SDoug Evans 287*01c966b5SDoug Evans static void emc_set_next_tx_descriptor(NPCM7xxEMCState *emc, 288*01c966b5SDoug Evans const NPCM7xxEMCTxDesc *tx_desc, 289*01c966b5SDoug Evans uint32_t desc_addr) 290*01c966b5SDoug Evans { 291*01c966b5SDoug Evans /* Update the current descriptor, if only to reset the owner flag. */ 292*01c966b5SDoug Evans if (emc_write_tx_desc(tx_desc, desc_addr)) { 293*01c966b5SDoug Evans /* 294*01c966b5SDoug Evans * We just read it so this shouldn't generally happen. 295*01c966b5SDoug Evans * Error already reported. 296*01c966b5SDoug Evans */ 297*01c966b5SDoug Evans emc_set_mista(emc, REG_MISTA_TXBERR); 298*01c966b5SDoug Evans } 299*01c966b5SDoug Evans emc->regs[REG_CTXDSA] = TX_DESC_NTXDSA(tx_desc->ntxdsa); 300*01c966b5SDoug Evans } 301*01c966b5SDoug Evans 302*01c966b5SDoug Evans static void emc_set_next_rx_descriptor(NPCM7xxEMCState *emc, 303*01c966b5SDoug Evans const NPCM7xxEMCRxDesc *rx_desc, 304*01c966b5SDoug Evans uint32_t desc_addr) 305*01c966b5SDoug Evans { 306*01c966b5SDoug Evans /* Update the current descriptor, if only to reset the owner flag. */ 307*01c966b5SDoug Evans if (emc_write_rx_desc(rx_desc, desc_addr)) { 308*01c966b5SDoug Evans /* 309*01c966b5SDoug Evans * We just read it so this shouldn't generally happen. 310*01c966b5SDoug Evans * Error already reported. 311*01c966b5SDoug Evans */ 312*01c966b5SDoug Evans emc_set_mista(emc, REG_MISTA_RXBERR); 313*01c966b5SDoug Evans } 314*01c966b5SDoug Evans emc->regs[REG_CRXDSA] = RX_DESC_NRXDSA(rx_desc->nrxdsa); 315*01c966b5SDoug Evans } 316*01c966b5SDoug Evans 317*01c966b5SDoug Evans static void emc_try_send_next_packet(NPCM7xxEMCState *emc) 318*01c966b5SDoug Evans { 319*01c966b5SDoug Evans /* Working buffer for sending out packets. Most packets fit in this. */ 320*01c966b5SDoug Evans #define TX_BUFFER_SIZE 2048 321*01c966b5SDoug Evans uint8_t tx_send_buffer[TX_BUFFER_SIZE]; 322*01c966b5SDoug Evans uint32_t desc_addr = TX_DESC_NTXDSA(emc->regs[REG_CTXDSA]); 323*01c966b5SDoug Evans NPCM7xxEMCTxDesc tx_desc; 324*01c966b5SDoug Evans uint32_t next_buf_addr, length; 325*01c966b5SDoug Evans uint8_t *buf; 326*01c966b5SDoug Evans g_autofree uint8_t *malloced_buf = NULL; 327*01c966b5SDoug Evans 328*01c966b5SDoug Evans if (emc_read_tx_desc(desc_addr, &tx_desc)) { 329*01c966b5SDoug Evans /* Error reading descriptor, already reported. */ 330*01c966b5SDoug Evans emc_halt_tx(emc, REG_MISTA_TXBERR); 331*01c966b5SDoug Evans emc_update_tx_irq(emc); 332*01c966b5SDoug Evans return; 333*01c966b5SDoug Evans } 334*01c966b5SDoug Evans 335*01c966b5SDoug Evans /* Nothing we can do if we don't own the descriptor. */ 336*01c966b5SDoug Evans if (!(tx_desc.flags & TX_DESC_FLAG_OWNER_MASK)) { 337*01c966b5SDoug Evans trace_npcm7xx_emc_cpu_owned_desc(desc_addr); 338*01c966b5SDoug Evans emc_halt_tx(emc, REG_MISTA_TDU); 339*01c966b5SDoug Evans emc_update_tx_irq(emc); 340*01c966b5SDoug Evans return; 341*01c966b5SDoug Evans } 342*01c966b5SDoug Evans 343*01c966b5SDoug Evans /* Give the descriptor back regardless of what happens. */ 344*01c966b5SDoug Evans tx_desc.flags &= ~TX_DESC_FLAG_OWNER_MASK; 345*01c966b5SDoug Evans tx_desc.status_and_length &= 0xffff; 346*01c966b5SDoug Evans 347*01c966b5SDoug Evans /* 348*01c966b5SDoug Evans * Despite the h/w documentation saying the tx buffer is word aligned, 349*01c966b5SDoug Evans * the linux driver does not word align the buffer. There is value in not 350*01c966b5SDoug Evans * aligning the buffer: See the description of NET_IP_ALIGN in linux 351*01c966b5SDoug Evans * kernel sources. 352*01c966b5SDoug Evans */ 353*01c966b5SDoug Evans next_buf_addr = tx_desc.txbsa; 354*01c966b5SDoug Evans emc->regs[REG_CTXBSA] = next_buf_addr; 355*01c966b5SDoug Evans length = TX_DESC_PKT_LEN(tx_desc.status_and_length); 356*01c966b5SDoug Evans buf = &tx_send_buffer[0]; 357*01c966b5SDoug Evans 358*01c966b5SDoug Evans if (length > sizeof(tx_send_buffer)) { 359*01c966b5SDoug Evans malloced_buf = g_malloc(length); 360*01c966b5SDoug Evans buf = malloced_buf; 361*01c966b5SDoug Evans } 362*01c966b5SDoug Evans 363*01c966b5SDoug Evans if (dma_memory_read(&address_space_memory, next_buf_addr, buf, length)) { 364*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, "%s: Failed to read packet @ 0x%x\n", 365*01c966b5SDoug Evans __func__, next_buf_addr); 366*01c966b5SDoug Evans emc_set_mista(emc, REG_MISTA_TXBERR); 367*01c966b5SDoug Evans emc_set_next_tx_descriptor(emc, &tx_desc, desc_addr); 368*01c966b5SDoug Evans emc_update_tx_irq(emc); 369*01c966b5SDoug Evans trace_npcm7xx_emc_tx_done(emc->regs[REG_CTXDSA]); 370*01c966b5SDoug Evans return; 371*01c966b5SDoug Evans } 372*01c966b5SDoug Evans 373*01c966b5SDoug Evans if ((tx_desc.flags & TX_DESC_FLAG_PADEN) && (length < MIN_PACKET_LENGTH)) { 374*01c966b5SDoug Evans memset(buf + length, 0, MIN_PACKET_LENGTH - length); 375*01c966b5SDoug Evans length = MIN_PACKET_LENGTH; 376*01c966b5SDoug Evans } 377*01c966b5SDoug Evans 378*01c966b5SDoug Evans /* N.B. emc_receive can get called here. */ 379*01c966b5SDoug Evans qemu_send_packet(qemu_get_queue(emc->nic), buf, length); 380*01c966b5SDoug Evans trace_npcm7xx_emc_sent_packet(length); 381*01c966b5SDoug Evans 382*01c966b5SDoug Evans tx_desc.status_and_length |= TX_DESC_STATUS_TXCP; 383*01c966b5SDoug Evans if (tx_desc.flags & TX_DESC_FLAG_INTEN) { 384*01c966b5SDoug Evans emc_set_mista(emc, REG_MISTA_TXCP); 385*01c966b5SDoug Evans } 386*01c966b5SDoug Evans if (emc->regs[REG_MISTA] & emc->regs[REG_MIEN] & REG_MISTA_TXINTR) { 387*01c966b5SDoug Evans tx_desc.status_and_length |= TX_DESC_STATUS_TXINTR; 388*01c966b5SDoug Evans } 389*01c966b5SDoug Evans 390*01c966b5SDoug Evans emc_set_next_tx_descriptor(emc, &tx_desc, desc_addr); 391*01c966b5SDoug Evans emc_update_tx_irq(emc); 392*01c966b5SDoug Evans trace_npcm7xx_emc_tx_done(emc->regs[REG_CTXDSA]); 393*01c966b5SDoug Evans } 394*01c966b5SDoug Evans 395*01c966b5SDoug Evans static bool emc_can_receive(NetClientState *nc) 396*01c966b5SDoug Evans { 397*01c966b5SDoug Evans NPCM7xxEMCState *emc = NPCM7XX_EMC(qemu_get_nic_opaque(nc)); 398*01c966b5SDoug Evans 399*01c966b5SDoug Evans bool can_receive = emc->rx_active; 400*01c966b5SDoug Evans trace_npcm7xx_emc_can_receive(can_receive); 401*01c966b5SDoug Evans return can_receive; 402*01c966b5SDoug Evans } 403*01c966b5SDoug Evans 404*01c966b5SDoug Evans /* If result is false then *fail_reason contains the reason. */ 405*01c966b5SDoug Evans static bool emc_receive_filter1(NPCM7xxEMCState *emc, const uint8_t *buf, 406*01c966b5SDoug Evans size_t len, const char **fail_reason) 407*01c966b5SDoug Evans { 408*01c966b5SDoug Evans eth_pkt_types_e pkt_type = get_eth_packet_type(PKT_GET_ETH_HDR(buf)); 409*01c966b5SDoug Evans 410*01c966b5SDoug Evans switch (pkt_type) { 411*01c966b5SDoug Evans case ETH_PKT_BCAST: 412*01c966b5SDoug Evans if (emc->regs[REG_CAMCMR] & REG_CAMCMR_CCAM) { 413*01c966b5SDoug Evans return true; 414*01c966b5SDoug Evans } else { 415*01c966b5SDoug Evans *fail_reason = "Broadcast packet disabled"; 416*01c966b5SDoug Evans return !!(emc->regs[REG_CAMCMR] & REG_CAMCMR_ABP); 417*01c966b5SDoug Evans } 418*01c966b5SDoug Evans case ETH_PKT_MCAST: 419*01c966b5SDoug Evans if (emc->regs[REG_CAMCMR] & REG_CAMCMR_CCAM) { 420*01c966b5SDoug Evans return true; 421*01c966b5SDoug Evans } else { 422*01c966b5SDoug Evans *fail_reason = "Multicast packet disabled"; 423*01c966b5SDoug Evans return !!(emc->regs[REG_CAMCMR] & REG_CAMCMR_AMP); 424*01c966b5SDoug Evans } 425*01c966b5SDoug Evans case ETH_PKT_UCAST: { 426*01c966b5SDoug Evans bool matches; 427*01c966b5SDoug Evans if (emc->regs[REG_CAMCMR] & REG_CAMCMR_AUP) { 428*01c966b5SDoug Evans return true; 429*01c966b5SDoug Evans } 430*01c966b5SDoug Evans matches = ((emc->regs[REG_CAMCMR] & REG_CAMCMR_ECMP) && 431*01c966b5SDoug Evans /* We only support one CAM register, CAM0. */ 432*01c966b5SDoug Evans (emc->regs[REG_CAMEN] & (1 << 0)) && 433*01c966b5SDoug Evans memcmp(buf, emc->conf.macaddr.a, ETH_ALEN) == 0); 434*01c966b5SDoug Evans if (emc->regs[REG_CAMCMR] & REG_CAMCMR_CCAM) { 435*01c966b5SDoug Evans *fail_reason = "MACADDR matched, comparison complemented"; 436*01c966b5SDoug Evans return !matches; 437*01c966b5SDoug Evans } else { 438*01c966b5SDoug Evans *fail_reason = "MACADDR didn't match"; 439*01c966b5SDoug Evans return matches; 440*01c966b5SDoug Evans } 441*01c966b5SDoug Evans } 442*01c966b5SDoug Evans default: 443*01c966b5SDoug Evans g_assert_not_reached(); 444*01c966b5SDoug Evans } 445*01c966b5SDoug Evans } 446*01c966b5SDoug Evans 447*01c966b5SDoug Evans static bool emc_receive_filter(NPCM7xxEMCState *emc, const uint8_t *buf, 448*01c966b5SDoug Evans size_t len) 449*01c966b5SDoug Evans { 450*01c966b5SDoug Evans const char *fail_reason = NULL; 451*01c966b5SDoug Evans bool ok = emc_receive_filter1(emc, buf, len, &fail_reason); 452*01c966b5SDoug Evans if (!ok) { 453*01c966b5SDoug Evans trace_npcm7xx_emc_packet_filtered_out(fail_reason); 454*01c966b5SDoug Evans } 455*01c966b5SDoug Evans return ok; 456*01c966b5SDoug Evans } 457*01c966b5SDoug Evans 458*01c966b5SDoug Evans static ssize_t emc_receive(NetClientState *nc, const uint8_t *buf, size_t len1) 459*01c966b5SDoug Evans { 460*01c966b5SDoug Evans NPCM7xxEMCState *emc = NPCM7XX_EMC(qemu_get_nic_opaque(nc)); 461*01c966b5SDoug Evans const uint32_t len = len1; 462*01c966b5SDoug Evans size_t max_frame_len; 463*01c966b5SDoug Evans bool long_frame; 464*01c966b5SDoug Evans uint32_t desc_addr; 465*01c966b5SDoug Evans NPCM7xxEMCRxDesc rx_desc; 466*01c966b5SDoug Evans uint32_t crc; 467*01c966b5SDoug Evans uint8_t *crc_ptr; 468*01c966b5SDoug Evans uint32_t buf_addr; 469*01c966b5SDoug Evans 470*01c966b5SDoug Evans trace_npcm7xx_emc_receiving_packet(len); 471*01c966b5SDoug Evans 472*01c966b5SDoug Evans if (!emc_can_receive(nc)) { 473*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, "%s: Unexpected packet\n", __func__); 474*01c966b5SDoug Evans return -1; 475*01c966b5SDoug Evans } 476*01c966b5SDoug Evans 477*01c966b5SDoug Evans if (len < ETH_HLEN || 478*01c966b5SDoug Evans /* Defensive programming: drop unsupportable large packets. */ 479*01c966b5SDoug Evans len > 0xffff - CRC_LENGTH) { 480*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, "%s: Dropped frame of %u bytes\n", 481*01c966b5SDoug Evans __func__, len); 482*01c966b5SDoug Evans return len; 483*01c966b5SDoug Evans } 484*01c966b5SDoug Evans 485*01c966b5SDoug Evans /* 486*01c966b5SDoug Evans * DENI is set if EMC received the Length/Type field of the incoming 487*01c966b5SDoug Evans * packet, so it will be set regardless of what happens next. 488*01c966b5SDoug Evans */ 489*01c966b5SDoug Evans emc_set_mista(emc, REG_MISTA_DENI); 490*01c966b5SDoug Evans 491*01c966b5SDoug Evans if (!emc_receive_filter(emc, buf, len)) { 492*01c966b5SDoug Evans emc_update_rx_irq(emc); 493*01c966b5SDoug Evans return len; 494*01c966b5SDoug Evans } 495*01c966b5SDoug Evans 496*01c966b5SDoug Evans /* Huge frames (> DMARFC) are dropped. */ 497*01c966b5SDoug Evans max_frame_len = REG_DMARFC_RXMS(emc->regs[REG_DMARFC]); 498*01c966b5SDoug Evans if (len + CRC_LENGTH > max_frame_len) { 499*01c966b5SDoug Evans trace_npcm7xx_emc_packet_dropped(len); 500*01c966b5SDoug Evans emc_set_mista(emc, REG_MISTA_DFOI); 501*01c966b5SDoug Evans emc_update_rx_irq(emc); 502*01c966b5SDoug Evans return len; 503*01c966b5SDoug Evans } 504*01c966b5SDoug Evans 505*01c966b5SDoug Evans /* 506*01c966b5SDoug Evans * Long Frames (> MAX_ETH_FRAME_SIZE) are also dropped, unless MCMDR.ALP 507*01c966b5SDoug Evans * is set. 508*01c966b5SDoug Evans */ 509*01c966b5SDoug Evans long_frame = false; 510*01c966b5SDoug Evans if (len + CRC_LENGTH > MAX_ETH_FRAME_SIZE) { 511*01c966b5SDoug Evans if (emc->regs[REG_MCMDR] & REG_MCMDR_ALP) { 512*01c966b5SDoug Evans long_frame = true; 513*01c966b5SDoug Evans } else { 514*01c966b5SDoug Evans trace_npcm7xx_emc_packet_dropped(len); 515*01c966b5SDoug Evans emc_set_mista(emc, REG_MISTA_PTLE); 516*01c966b5SDoug Evans emc_update_rx_irq(emc); 517*01c966b5SDoug Evans return len; 518*01c966b5SDoug Evans } 519*01c966b5SDoug Evans } 520*01c966b5SDoug Evans 521*01c966b5SDoug Evans desc_addr = RX_DESC_NRXDSA(emc->regs[REG_CRXDSA]); 522*01c966b5SDoug Evans if (emc_read_rx_desc(desc_addr, &rx_desc)) { 523*01c966b5SDoug Evans /* Error reading descriptor, already reported. */ 524*01c966b5SDoug Evans emc_halt_rx(emc, REG_MISTA_RXBERR); 525*01c966b5SDoug Evans emc_update_rx_irq(emc); 526*01c966b5SDoug Evans return len; 527*01c966b5SDoug Evans } 528*01c966b5SDoug Evans 529*01c966b5SDoug Evans /* Nothing we can do if we don't own the descriptor. */ 530*01c966b5SDoug Evans if (!(rx_desc.status_and_length & RX_DESC_STATUS_OWNER_MASK)) { 531*01c966b5SDoug Evans trace_npcm7xx_emc_cpu_owned_desc(desc_addr); 532*01c966b5SDoug Evans emc_halt_rx(emc, REG_MISTA_RDU); 533*01c966b5SDoug Evans emc_update_rx_irq(emc); 534*01c966b5SDoug Evans return len; 535*01c966b5SDoug Evans } 536*01c966b5SDoug Evans 537*01c966b5SDoug Evans crc = 0; 538*01c966b5SDoug Evans crc_ptr = (uint8_t *) &crc; 539*01c966b5SDoug Evans if (!(emc->regs[REG_MCMDR] & REG_MCMDR_SPCRC)) { 540*01c966b5SDoug Evans crc = cpu_to_be32(crc32(~0, buf, len)); 541*01c966b5SDoug Evans } 542*01c966b5SDoug Evans 543*01c966b5SDoug Evans /* Give the descriptor back regardless of what happens. */ 544*01c966b5SDoug Evans rx_desc.status_and_length &= ~RX_DESC_STATUS_OWNER_MASK; 545*01c966b5SDoug Evans 546*01c966b5SDoug Evans buf_addr = rx_desc.rxbsa; 547*01c966b5SDoug Evans emc->regs[REG_CRXBSA] = buf_addr; 548*01c966b5SDoug Evans if (dma_memory_write(&address_space_memory, buf_addr, buf, len) || 549*01c966b5SDoug Evans (!(emc->regs[REG_MCMDR] & REG_MCMDR_SPCRC) && 550*01c966b5SDoug Evans dma_memory_write(&address_space_memory, buf_addr + len, crc_ptr, 551*01c966b5SDoug Evans 4))) { 552*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, "%s: Bus error writing packet\n", 553*01c966b5SDoug Evans __func__); 554*01c966b5SDoug Evans emc_set_mista(emc, REG_MISTA_RXBERR); 555*01c966b5SDoug Evans emc_set_next_rx_descriptor(emc, &rx_desc, desc_addr); 556*01c966b5SDoug Evans emc_update_rx_irq(emc); 557*01c966b5SDoug Evans trace_npcm7xx_emc_rx_done(emc->regs[REG_CRXDSA]); 558*01c966b5SDoug Evans return len; 559*01c966b5SDoug Evans } 560*01c966b5SDoug Evans 561*01c966b5SDoug Evans trace_npcm7xx_emc_received_packet(len); 562*01c966b5SDoug Evans 563*01c966b5SDoug Evans /* Note: We've already verified len+4 <= 0xffff. */ 564*01c966b5SDoug Evans rx_desc.status_and_length = len; 565*01c966b5SDoug Evans if (!(emc->regs[REG_MCMDR] & REG_MCMDR_SPCRC)) { 566*01c966b5SDoug Evans rx_desc.status_and_length += 4; 567*01c966b5SDoug Evans } 568*01c966b5SDoug Evans rx_desc.status_and_length |= RX_DESC_STATUS_RXGD; 569*01c966b5SDoug Evans emc_set_mista(emc, REG_MISTA_RXGD); 570*01c966b5SDoug Evans 571*01c966b5SDoug Evans if (emc->regs[REG_MISTA] & emc->regs[REG_MIEN] & REG_MISTA_RXINTR) { 572*01c966b5SDoug Evans rx_desc.status_and_length |= RX_DESC_STATUS_RXINTR; 573*01c966b5SDoug Evans } 574*01c966b5SDoug Evans if (long_frame) { 575*01c966b5SDoug Evans rx_desc.status_and_length |= RX_DESC_STATUS_PTLE; 576*01c966b5SDoug Evans } 577*01c966b5SDoug Evans 578*01c966b5SDoug Evans emc_set_next_rx_descriptor(emc, &rx_desc, desc_addr); 579*01c966b5SDoug Evans emc_update_rx_irq(emc); 580*01c966b5SDoug Evans trace_npcm7xx_emc_rx_done(emc->regs[REG_CRXDSA]); 581*01c966b5SDoug Evans return len; 582*01c966b5SDoug Evans } 583*01c966b5SDoug Evans 584*01c966b5SDoug Evans static void emc_try_receive_next_packet(NPCM7xxEMCState *emc) 585*01c966b5SDoug Evans { 586*01c966b5SDoug Evans if (emc_can_receive(qemu_get_queue(emc->nic))) { 587*01c966b5SDoug Evans qemu_flush_queued_packets(qemu_get_queue(emc->nic)); 588*01c966b5SDoug Evans } 589*01c966b5SDoug Evans } 590*01c966b5SDoug Evans 591*01c966b5SDoug Evans static uint64_t npcm7xx_emc_read(void *opaque, hwaddr offset, unsigned size) 592*01c966b5SDoug Evans { 593*01c966b5SDoug Evans NPCM7xxEMCState *emc = opaque; 594*01c966b5SDoug Evans uint32_t reg = offset / sizeof(uint32_t); 595*01c966b5SDoug Evans uint32_t result; 596*01c966b5SDoug Evans 597*01c966b5SDoug Evans if (reg >= NPCM7XX_NUM_EMC_REGS) { 598*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, 599*01c966b5SDoug Evans "%s: Invalid offset 0x%04" HWADDR_PRIx "\n", 600*01c966b5SDoug Evans __func__, offset); 601*01c966b5SDoug Evans return 0; 602*01c966b5SDoug Evans } 603*01c966b5SDoug Evans 604*01c966b5SDoug Evans switch (reg) { 605*01c966b5SDoug Evans case REG_MIID: 606*01c966b5SDoug Evans /* 607*01c966b5SDoug Evans * We don't implement MII. For determinism, always return zero as 608*01c966b5SDoug Evans * writes record the last value written for debugging purposes. 609*01c966b5SDoug Evans */ 610*01c966b5SDoug Evans qemu_log_mask(LOG_UNIMP, "%s: Read of MIID, returning 0\n", __func__); 611*01c966b5SDoug Evans result = 0; 612*01c966b5SDoug Evans break; 613*01c966b5SDoug Evans case REG_TSDR: 614*01c966b5SDoug Evans case REG_RSDR: 615*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, 616*01c966b5SDoug Evans "%s: Read of write-only reg, %s/%d\n", 617*01c966b5SDoug Evans __func__, emc_reg_name(reg), reg); 618*01c966b5SDoug Evans return 0; 619*01c966b5SDoug Evans default: 620*01c966b5SDoug Evans result = emc->regs[reg]; 621*01c966b5SDoug Evans break; 622*01c966b5SDoug Evans } 623*01c966b5SDoug Evans 624*01c966b5SDoug Evans trace_npcm7xx_emc_reg_read(emc->emc_num, result, emc_reg_name(reg), reg); 625*01c966b5SDoug Evans return result; 626*01c966b5SDoug Evans } 627*01c966b5SDoug Evans 628*01c966b5SDoug Evans static void npcm7xx_emc_write(void *opaque, hwaddr offset, 629*01c966b5SDoug Evans uint64_t v, unsigned size) 630*01c966b5SDoug Evans { 631*01c966b5SDoug Evans NPCM7xxEMCState *emc = opaque; 632*01c966b5SDoug Evans uint32_t reg = offset / sizeof(uint32_t); 633*01c966b5SDoug Evans uint32_t value = v; 634*01c966b5SDoug Evans 635*01c966b5SDoug Evans g_assert(size == sizeof(uint32_t)); 636*01c966b5SDoug Evans 637*01c966b5SDoug Evans if (reg >= NPCM7XX_NUM_EMC_REGS) { 638*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, 639*01c966b5SDoug Evans "%s: Invalid offset 0x%04" HWADDR_PRIx "\n", 640*01c966b5SDoug Evans __func__, offset); 641*01c966b5SDoug Evans return; 642*01c966b5SDoug Evans } 643*01c966b5SDoug Evans 644*01c966b5SDoug Evans trace_npcm7xx_emc_reg_write(emc->emc_num, emc_reg_name(reg), reg, value); 645*01c966b5SDoug Evans 646*01c966b5SDoug Evans switch (reg) { 647*01c966b5SDoug Evans case REG_CAMCMR: 648*01c966b5SDoug Evans emc->regs[reg] = value; 649*01c966b5SDoug Evans break; 650*01c966b5SDoug Evans case REG_CAMEN: 651*01c966b5SDoug Evans /* Only CAM0 is supported, don't pretend otherwise. */ 652*01c966b5SDoug Evans if (value & ~1) { 653*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, 654*01c966b5SDoug Evans "%s: Only CAM0 is supported, cannot enable others" 655*01c966b5SDoug Evans ": 0x%x\n", 656*01c966b5SDoug Evans __func__, value); 657*01c966b5SDoug Evans } 658*01c966b5SDoug Evans emc->regs[reg] = value & 1; 659*01c966b5SDoug Evans break; 660*01c966b5SDoug Evans case REG_CAMM_BASE + 0: 661*01c966b5SDoug Evans emc->regs[reg] = value; 662*01c966b5SDoug Evans emc->conf.macaddr.a[0] = value >> 24; 663*01c966b5SDoug Evans emc->conf.macaddr.a[1] = value >> 16; 664*01c966b5SDoug Evans emc->conf.macaddr.a[2] = value >> 8; 665*01c966b5SDoug Evans emc->conf.macaddr.a[3] = value >> 0; 666*01c966b5SDoug Evans break; 667*01c966b5SDoug Evans case REG_CAML_BASE + 0: 668*01c966b5SDoug Evans emc->regs[reg] = value; 669*01c966b5SDoug Evans emc->conf.macaddr.a[4] = value >> 24; 670*01c966b5SDoug Evans emc->conf.macaddr.a[5] = value >> 16; 671*01c966b5SDoug Evans break; 672*01c966b5SDoug Evans case REG_MCMDR: { 673*01c966b5SDoug Evans uint32_t prev; 674*01c966b5SDoug Evans if (value & REG_MCMDR_SWR) { 675*01c966b5SDoug Evans emc_soft_reset(emc); 676*01c966b5SDoug Evans /* On h/w the reset happens over multiple cycles. For now KISS. */ 677*01c966b5SDoug Evans break; 678*01c966b5SDoug Evans } 679*01c966b5SDoug Evans prev = emc->regs[reg]; 680*01c966b5SDoug Evans emc->regs[reg] = value; 681*01c966b5SDoug Evans /* Update tx state. */ 682*01c966b5SDoug Evans if (!(prev & REG_MCMDR_TXON) && 683*01c966b5SDoug Evans (value & REG_MCMDR_TXON)) { 684*01c966b5SDoug Evans emc->regs[REG_CTXDSA] = emc->regs[REG_TXDLSA]; 685*01c966b5SDoug Evans /* 686*01c966b5SDoug Evans * Linux kernel turns TX on with CPU still holding descriptor, 687*01c966b5SDoug Evans * which suggests we should wait for a write to TSDR before trying 688*01c966b5SDoug Evans * to send a packet: so we don't send one here. 689*01c966b5SDoug Evans */ 690*01c966b5SDoug Evans } else if ((prev & REG_MCMDR_TXON) && 691*01c966b5SDoug Evans !(value & REG_MCMDR_TXON)) { 692*01c966b5SDoug Evans emc->regs[REG_MGSTA] |= REG_MGSTA_TXHA; 693*01c966b5SDoug Evans } 694*01c966b5SDoug Evans if (!(value & REG_MCMDR_TXON)) { 695*01c966b5SDoug Evans emc_halt_tx(emc, 0); 696*01c966b5SDoug Evans } 697*01c966b5SDoug Evans /* Update rx state. */ 698*01c966b5SDoug Evans if (!(prev & REG_MCMDR_RXON) && 699*01c966b5SDoug Evans (value & REG_MCMDR_RXON)) { 700*01c966b5SDoug Evans emc->regs[REG_CRXDSA] = emc->regs[REG_RXDLSA]; 701*01c966b5SDoug Evans } else if ((prev & REG_MCMDR_RXON) && 702*01c966b5SDoug Evans !(value & REG_MCMDR_RXON)) { 703*01c966b5SDoug Evans emc->regs[REG_MGSTA] |= REG_MGSTA_RXHA; 704*01c966b5SDoug Evans } 705*01c966b5SDoug Evans if (!(value & REG_MCMDR_RXON)) { 706*01c966b5SDoug Evans emc_halt_rx(emc, 0); 707*01c966b5SDoug Evans } 708*01c966b5SDoug Evans break; 709*01c966b5SDoug Evans } 710*01c966b5SDoug Evans case REG_TXDLSA: 711*01c966b5SDoug Evans case REG_RXDLSA: 712*01c966b5SDoug Evans case REG_DMARFC: 713*01c966b5SDoug Evans case REG_MIID: 714*01c966b5SDoug Evans emc->regs[reg] = value; 715*01c966b5SDoug Evans break; 716*01c966b5SDoug Evans case REG_MIEN: 717*01c966b5SDoug Evans emc->regs[reg] = value; 718*01c966b5SDoug Evans emc_update_irq_from_reg_change(emc); 719*01c966b5SDoug Evans break; 720*01c966b5SDoug Evans case REG_MISTA: 721*01c966b5SDoug Evans /* Clear the bits that have 1 in "value". */ 722*01c966b5SDoug Evans emc->regs[reg] &= ~value; 723*01c966b5SDoug Evans emc_update_irq_from_reg_change(emc); 724*01c966b5SDoug Evans break; 725*01c966b5SDoug Evans case REG_MGSTA: 726*01c966b5SDoug Evans /* Clear the bits that have 1 in "value". */ 727*01c966b5SDoug Evans emc->regs[reg] &= ~value; 728*01c966b5SDoug Evans break; 729*01c966b5SDoug Evans case REG_TSDR: 730*01c966b5SDoug Evans if (emc->regs[REG_MCMDR] & REG_MCMDR_TXON) { 731*01c966b5SDoug Evans emc->tx_active = true; 732*01c966b5SDoug Evans /* Keep trying to send packets until we run out. */ 733*01c966b5SDoug Evans while (emc->tx_active) { 734*01c966b5SDoug Evans emc_try_send_next_packet(emc); 735*01c966b5SDoug Evans } 736*01c966b5SDoug Evans } 737*01c966b5SDoug Evans break; 738*01c966b5SDoug Evans case REG_RSDR: 739*01c966b5SDoug Evans if (emc->regs[REG_MCMDR] & REG_MCMDR_RXON) { 740*01c966b5SDoug Evans emc->rx_active = true; 741*01c966b5SDoug Evans emc_try_receive_next_packet(emc); 742*01c966b5SDoug Evans } 743*01c966b5SDoug Evans break; 744*01c966b5SDoug Evans case REG_MIIDA: 745*01c966b5SDoug Evans emc->regs[reg] = value & ~REG_MIIDA_BUSY; 746*01c966b5SDoug Evans break; 747*01c966b5SDoug Evans case REG_MRPC: 748*01c966b5SDoug Evans case REG_MRPCC: 749*01c966b5SDoug Evans case REG_MREPC: 750*01c966b5SDoug Evans case REG_CTXDSA: 751*01c966b5SDoug Evans case REG_CTXBSA: 752*01c966b5SDoug Evans case REG_CRXDSA: 753*01c966b5SDoug Evans case REG_CRXBSA: 754*01c966b5SDoug Evans qemu_log_mask(LOG_GUEST_ERROR, 755*01c966b5SDoug Evans "%s: Write to read-only reg %s/%d\n", 756*01c966b5SDoug Evans __func__, emc_reg_name(reg), reg); 757*01c966b5SDoug Evans break; 758*01c966b5SDoug Evans default: 759*01c966b5SDoug Evans qemu_log_mask(LOG_UNIMP, "%s: Write to unimplemented reg %s/%d\n", 760*01c966b5SDoug Evans __func__, emc_reg_name(reg), reg); 761*01c966b5SDoug Evans break; 762*01c966b5SDoug Evans } 763*01c966b5SDoug Evans } 764*01c966b5SDoug Evans 765*01c966b5SDoug Evans static const struct MemoryRegionOps npcm7xx_emc_ops = { 766*01c966b5SDoug Evans .read = npcm7xx_emc_read, 767*01c966b5SDoug Evans .write = npcm7xx_emc_write, 768*01c966b5SDoug Evans .endianness = DEVICE_LITTLE_ENDIAN, 769*01c966b5SDoug Evans .valid = { 770*01c966b5SDoug Evans .min_access_size = 4, 771*01c966b5SDoug Evans .max_access_size = 4, 772*01c966b5SDoug Evans .unaligned = false, 773*01c966b5SDoug Evans }, 774*01c966b5SDoug Evans }; 775*01c966b5SDoug Evans 776*01c966b5SDoug Evans static void emc_cleanup(NetClientState *nc) 777*01c966b5SDoug Evans { 778*01c966b5SDoug Evans /* Nothing to do yet. */ 779*01c966b5SDoug Evans } 780*01c966b5SDoug Evans 781*01c966b5SDoug Evans static NetClientInfo net_npcm7xx_emc_info = { 782*01c966b5SDoug Evans .type = NET_CLIENT_DRIVER_NIC, 783*01c966b5SDoug Evans .size = sizeof(NICState), 784*01c966b5SDoug Evans .can_receive = emc_can_receive, 785*01c966b5SDoug Evans .receive = emc_receive, 786*01c966b5SDoug Evans .cleanup = emc_cleanup, 787*01c966b5SDoug Evans .link_status_changed = emc_set_link, 788*01c966b5SDoug Evans }; 789*01c966b5SDoug Evans 790*01c966b5SDoug Evans static void npcm7xx_emc_realize(DeviceState *dev, Error **errp) 791*01c966b5SDoug Evans { 792*01c966b5SDoug Evans NPCM7xxEMCState *emc = NPCM7XX_EMC(dev); 793*01c966b5SDoug Evans SysBusDevice *sbd = SYS_BUS_DEVICE(emc); 794*01c966b5SDoug Evans 795*01c966b5SDoug Evans memory_region_init_io(&emc->iomem, OBJECT(emc), &npcm7xx_emc_ops, emc, 796*01c966b5SDoug Evans TYPE_NPCM7XX_EMC, 4 * KiB); 797*01c966b5SDoug Evans sysbus_init_mmio(sbd, &emc->iomem); 798*01c966b5SDoug Evans sysbus_init_irq(sbd, &emc->tx_irq); 799*01c966b5SDoug Evans sysbus_init_irq(sbd, &emc->rx_irq); 800*01c966b5SDoug Evans 801*01c966b5SDoug Evans qemu_macaddr_default_if_unset(&emc->conf.macaddr); 802*01c966b5SDoug Evans emc->nic = qemu_new_nic(&net_npcm7xx_emc_info, &emc->conf, 803*01c966b5SDoug Evans object_get_typename(OBJECT(dev)), dev->id, emc); 804*01c966b5SDoug Evans qemu_format_nic_info_str(qemu_get_queue(emc->nic), emc->conf.macaddr.a); 805*01c966b5SDoug Evans } 806*01c966b5SDoug Evans 807*01c966b5SDoug Evans static void npcm7xx_emc_unrealize(DeviceState *dev) 808*01c966b5SDoug Evans { 809*01c966b5SDoug Evans NPCM7xxEMCState *emc = NPCM7XX_EMC(dev); 810*01c966b5SDoug Evans 811*01c966b5SDoug Evans qemu_del_nic(emc->nic); 812*01c966b5SDoug Evans } 813*01c966b5SDoug Evans 814*01c966b5SDoug Evans static const VMStateDescription vmstate_npcm7xx_emc = { 815*01c966b5SDoug Evans .name = TYPE_NPCM7XX_EMC, 816*01c966b5SDoug Evans .version_id = 0, 817*01c966b5SDoug Evans .minimum_version_id = 0, 818*01c966b5SDoug Evans .fields = (VMStateField[]) { 819*01c966b5SDoug Evans VMSTATE_UINT8(emc_num, NPCM7xxEMCState), 820*01c966b5SDoug Evans VMSTATE_UINT32_ARRAY(regs, NPCM7xxEMCState, NPCM7XX_NUM_EMC_REGS), 821*01c966b5SDoug Evans VMSTATE_BOOL(tx_active, NPCM7xxEMCState), 822*01c966b5SDoug Evans VMSTATE_BOOL(rx_active, NPCM7xxEMCState), 823*01c966b5SDoug Evans VMSTATE_END_OF_LIST(), 824*01c966b5SDoug Evans }, 825*01c966b5SDoug Evans }; 826*01c966b5SDoug Evans 827*01c966b5SDoug Evans static Property npcm7xx_emc_properties[] = { 828*01c966b5SDoug Evans DEFINE_NIC_PROPERTIES(NPCM7xxEMCState, conf), 829*01c966b5SDoug Evans DEFINE_PROP_END_OF_LIST(), 830*01c966b5SDoug Evans }; 831*01c966b5SDoug Evans 832*01c966b5SDoug Evans static void npcm7xx_emc_class_init(ObjectClass *klass, void *data) 833*01c966b5SDoug Evans { 834*01c966b5SDoug Evans DeviceClass *dc = DEVICE_CLASS(klass); 835*01c966b5SDoug Evans 836*01c966b5SDoug Evans set_bit(DEVICE_CATEGORY_NETWORK, dc->categories); 837*01c966b5SDoug Evans dc->desc = "NPCM7xx EMC Controller"; 838*01c966b5SDoug Evans dc->realize = npcm7xx_emc_realize; 839*01c966b5SDoug Evans dc->unrealize = npcm7xx_emc_unrealize; 840*01c966b5SDoug Evans dc->reset = npcm7xx_emc_reset; 841*01c966b5SDoug Evans dc->vmsd = &vmstate_npcm7xx_emc; 842*01c966b5SDoug Evans device_class_set_props(dc, npcm7xx_emc_properties); 843*01c966b5SDoug Evans } 844*01c966b5SDoug Evans 845*01c966b5SDoug Evans static const TypeInfo npcm7xx_emc_info = { 846*01c966b5SDoug Evans .name = TYPE_NPCM7XX_EMC, 847*01c966b5SDoug Evans .parent = TYPE_SYS_BUS_DEVICE, 848*01c966b5SDoug Evans .instance_size = sizeof(NPCM7xxEMCState), 849*01c966b5SDoug Evans .class_init = npcm7xx_emc_class_init, 850*01c966b5SDoug Evans }; 851*01c966b5SDoug Evans 852*01c966b5SDoug Evans static void npcm7xx_emc_register_type(void) 853*01c966b5SDoug Evans { 854*01c966b5SDoug Evans type_register_static(&npcm7xx_emc_info); 855*01c966b5SDoug Evans } 856*01c966b5SDoug Evans 857*01c966b5SDoug Evans type_init(npcm7xx_emc_register_type) 858