diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/clk/imx/clk-imx7.c | 2 | ||||
-rw-r--r-- | drivers/efi/efi-device.c | 2 | ||||
-rw-r--r-- | drivers/mtd/peb.c | 27 | ||||
-rw-r--r-- | drivers/mtd/ubi/fastmap.c | 3 | ||||
-rw-r--r-- | drivers/net/designware.c | 42 | ||||
-rw-r--r-- | drivers/net/phy/micrel.c | 32 | ||||
-rw-r--r-- | drivers/nvmem/eeprom_93xx46.c | 5 | ||||
-rw-r--r-- | drivers/of/of_net.c | 12 | ||||
-rw-r--r-- | drivers/pci/pcie-designware-host.c | 2 |
9 files changed, 109 insertions, 18 deletions
diff --git a/drivers/clk/imx/clk-imx7.c b/drivers/clk/imx/clk-imx7.c index 97fe7abda2..781bc43e09 100644 --- a/drivers/clk/imx/clk-imx7.c +++ b/drivers/clk/imx/clk-imx7.c @@ -743,7 +743,7 @@ static int imx7_ccm_probe(struct device_d *dev) "enet_axi_post_div", base + 0x4700, 0); clks[IMX7D_ENET1_TIME_ROOT_CLK] = imx_clk_gate2_shared2("enet1_time_root_clk", "enet1_time_post_div", base + 0x4700, 0); - clks[IMX7D_ENET2_IPG_ROOT_CLK] = imx_clk_gate2_shared2("enet2_ipg_root_clk", + clks[IMX7D_ENET2_IPG_ROOT_CLK] = imx_clk_gate2_shared2("enet2_ipg_root_clk", "enet_axi_post_div", base + 0x4710, 0); clks[IMX7D_ENET2_TIME_ROOT_CLK] = imx_clk_gate2_shared2("enet2_time_root_clk", "enet2_time_post_div", base + 0x4710, 0); diff --git a/drivers/efi/efi-device.c b/drivers/efi/efi-device.c index b7dea7c822..5cc68fb781 100644 --- a/drivers/efi/efi-device.c +++ b/drivers/efi/efi-device.c @@ -551,7 +551,7 @@ static int do_efi_protocol_dump(int argc, char **argv) if (len != 36) return -EINVAL; - + read_xbit(s, a, 32); if (*s != '-') return -EINVAL; diff --git a/drivers/mtd/peb.c b/drivers/mtd/peb.c index c35b63f2fd..388db7f587 100644 --- a/drivers/mtd/peb.c +++ b/drivers/mtd/peb.c @@ -130,6 +130,33 @@ int mtd_num_pebs(struct mtd_info *mtd) } /** + * mtd_skip_bad - skip bad blocks + * @mtd: mtd device + * @pnum: The number of the block + * + * This function skips bad blocks beginning from @pnum. Returns 0 for success and + * a negative error code otherwise. on successful exit @pnum points to the next + * good block. + */ +int mtd_skip_bad(struct mtd_info *mtd, int *pnum) +{ + if (*pnum < 0) + return -EINVAL; + + while (1) { + loff_t offset = (uint64_t)mtd->erasesize * *pnum; + + if (offset >= mtd->size) + return -ENOSPC; + + if (!mtd_block_isbad(mtd, offset)) + return 0; + + *pnum = *pnum + 1; + } +} + +/** * mtd_peb_mark_bad - mark a physical eraseblock as bad * @mtd: mtd device * @pnum: The number of the block diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c index 84c2912bf5..32b60ccad8 100644 --- a/drivers/mtd/ubi/fastmap.c +++ b/drivers/mtd/ubi/fastmap.c @@ -1051,7 +1051,8 @@ int ubi_fastmap_init_checkmap(struct ubi_volume *vol, int leb_count) void ubi_fastmap_destroy_checkmap(struct ubi_volume *vol) { - kfree(vol->checkmap); + if (vol) + kfree(vol->checkmap); } /** diff --git a/drivers/net/designware.c b/drivers/net/designware.c index 3c9bca981c..0ee6d3d78a 100644 --- a/drivers/net/designware.c +++ b/drivers/net/designware.c @@ -328,24 +328,48 @@ static int dwc_ether_rx(struct eth_device *dev) u32 status = desc_p->txrx_status; int length = 0; + int ret = 0; /* Check if the owner is the CPU */ if (status & DESC_RXSTS_OWNBYDMA) return 0; - length = (status & DESC_RXSTS_FRMLENMSK) >> - DESC_RXSTS_FRMLENSHFT; + if ((status & (DESC_RXSTS_ERROR | DESC_RXSTS_DAFILTERFAIL | + DESC_RXSTS_SAFILTERFAIL)) || + (status & (DESC_RXSTS_RXIPC_GIANTFRAME | + DESC_RXSTS_RXFRAMEETHER)) == + DESC_RXSTS_RXIPC_GIANTFRAME) { + /* Error in packet - discard it */ + dev_warn(&dev->dev, "Rx error status (%x)\n", + status & (DESC_RXSTS_DAFILTERFAIL | + DESC_RXSTS_ERROR | + DESC_RXSTS_RXTRUNCATED | + DESC_RXSTS_SAFILTERFAIL | + DESC_RXSTS_RXIPC_GIANTFRAME | + DESC_RXSTS_RXDAMAGED | + DESC_RXSTS_RXIPC_GIANT | + DESC_RXSTS_RXCOLLISION | + DESC_RXSTS_RXFRAMEETHER | + DESC_RXSTS_RXWATCHDOG | + DESC_RXSTS_RXMIIERROR | + DESC_RXSTS_RXCRC)); + ret = -EIO; + } else { + length = (status & DESC_RXSTS_FRMLENMSK) >> + DESC_RXSTS_FRMLENSHFT; + + dma_sync_single_for_cpu((unsigned long)desc_p->dmamac_addr, + length, DMA_FROM_DEVICE); + net_receive(dev, desc_p->dmamac_addr, length); + dma_sync_single_for_device((unsigned long)desc_p->dmamac_addr, + length, DMA_FROM_DEVICE); + ret = length; + } /* * Make the current descriptor valid again and go to * the next one */ - dma_sync_single_for_cpu((unsigned long)desc_p->dmamac_addr, length, - DMA_FROM_DEVICE); - net_receive(dev, desc_p->dmamac_addr, length); - dma_sync_single_for_device((unsigned long)desc_p->dmamac_addr, length, - DMA_FROM_DEVICE); - desc_p->txrx_status |= DESC_RXSTS_OWNBYDMA; /* Test the wrap-around condition. */ @@ -354,7 +378,7 @@ static int dwc_ether_rx(struct eth_device *dev) priv->rx_currdescnum = desc_num; - return length; + return ret; } static void dwc_ether_halt (struct eth_device *dev) diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 67c2ca9d54..8f0b81d8fa 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -220,6 +220,7 @@ static int ksz9031_config_init(struct phy_device *phydev) "txd2-skew-ps", "txd3-skew-ps" }; static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"}; + int ret; if (!of_node && dev->parent->device_node) of_node = dev->parent->device_node; @@ -240,9 +241,40 @@ static int ksz9031_config_init(struct phy_device *phydev) ksz9031_of_load_skew_values(phydev, of_node, MII_KSZ9031RN_TX_DATA_PAD_SKEW, 4, tx_data_skews, 4); + + /* Silicon Errata Sheet (DS80000691D or DS80000692D): + * When the device links in the 1000BASE-T slave mode only, + * the optional 125MHz reference output clock (CLK125_NDO) + * has wide duty cycle variation. + * + * The optional CLK125_NDO clock does not meet the RGMII + * 45/55 percent (min/max) duty cycle requirement and therefore + * cannot be used directly by the MAC side for clocking + * applications that have setup/hold time requirements on + * rising and falling clock edges. + * + * Workaround: + * Force the phy to be the master to receive a stable clock + * which meets the duty cycle requirement. + */ + if (of_property_read_bool(of_node, "micrel,force-master")) { + ret = phy_read(phydev, MII_CTRL1000); + if (ret < 0) + goto err_force_master; + + /* enable master mode, config & prefer master */ + ret |= CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER; + ret = phy_write(phydev, MII_CTRL1000, ret); + if (ret < 0) + goto err_force_master; + } } return ksz9031_center_flp_timing(phydev); + +err_force_master: + dev_err(dev, "failed to force the phy to master mode\n"); + return ret; } #define KSZ8873MLL_GLOBAL_CONTROL_4 0x06 diff --git a/drivers/nvmem/eeprom_93xx46.c b/drivers/nvmem/eeprom_93xx46.c index d96ba32d07..49ed396dc2 100644 --- a/drivers/nvmem/eeprom_93xx46.c +++ b/drivers/nvmem/eeprom_93xx46.c @@ -339,7 +339,7 @@ static int eeprom_93xx46_probe_dt(struct spi_device *spi) if (of_property_read_bool(np, "read-only")) pd->flags |= EE_READONLY; - pd->select =of_get_named_gpio_flags(np, "select", 0, &of_flags); + pd->select = of_get_named_gpio_flags(np, "select", 0, &of_flags); if (gpio_is_valid(pd->select)) { char *name; @@ -441,6 +441,3 @@ static struct driver_d eeprom_93xx46_driver = { .of_compatible = DRV_OF_COMPAT(eeprom_93xx46_of_table), }; device_spi_driver(eeprom_93xx46_driver); - - - diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c index 9b54e44674..cee4597195 100644 --- a/drivers/of/of_net.c +++ b/drivers/of/of_net.c @@ -17,18 +17,28 @@ */ static const char *phy_modes[] = { [PHY_INTERFACE_MODE_NA] = "", + [PHY_INTERFACE_MODE_INTERNAL] = "internal", [PHY_INTERFACE_MODE_MII] = "mii", [PHY_INTERFACE_MODE_GMII] = "gmii", [PHY_INTERFACE_MODE_SGMII] = "sgmii", [PHY_INTERFACE_MODE_TBI] = "tbi", + [PHY_INTERFACE_MODE_REVMII] = "rev-mii", [PHY_INTERFACE_MODE_RMII] = "rmii", [PHY_INTERFACE_MODE_RGMII] = "rgmii", [PHY_INTERFACE_MODE_RGMII_ID] = "rgmii-id", [PHY_INTERFACE_MODE_RGMII_RXID] = "rgmii-rxid", - [PHY_INTERFACE_MODE_RGMII_TXID] = "rgmii-txid", + [PHY_INTERFACE_MODE_RGMII_TXID] = "rgmii-txid", [PHY_INTERFACE_MODE_RTBI] = "rtbi", [PHY_INTERFACE_MODE_SMII] = "smii", + [PHY_INTERFACE_MODE_XGMII] = "xgmii", + [PHY_INTERFACE_MODE_MOCA] = "moca", [PHY_INTERFACE_MODE_QSGMII] = "qsgmii", + [PHY_INTERFACE_MODE_TRGMII] = "trgmii", + [PHY_INTERFACE_MODE_1000BASEX] = "1000base-x", + [PHY_INTERFACE_MODE_2500BASEX] = "2500base-x", + [PHY_INTERFACE_MODE_RXAUI] = "rxaui", + [PHY_INTERFACE_MODE_XAUI] = "xaui", + [PHY_INTERFACE_MODE_10GKR] = "10gbase-kr", }; /** diff --git a/drivers/pci/pcie-designware-host.c b/drivers/pci/pcie-designware-host.c index dc38cdc8f6..63ce3696d1 100644 --- a/drivers/pci/pcie-designware-host.c +++ b/drivers/pci/pcie-designware-host.c @@ -391,7 +391,7 @@ void dw_pcie_setup_rc(struct pcie_port *pp) pci->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pci); dev_dbg(pci->dev, "iATU unroll: %s\n", pci->iatu_unroll_enabled ? "enabled" : "disabled"); - + dw_pcie_prog_outbound_atu(pci, PCIE_ATU_REGION_INDEX0, PCIE_ATU_TYPE_MEM, pp->mem_mod_base, pp->mem_bus_addr, pp->mem_size); |