summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/imx/clk-imx7.c2
-rw-r--r--drivers/efi/efi-device.c2
-rw-r--r--drivers/mtd/peb.c27
-rw-r--r--drivers/mtd/ubi/fastmap.c3
-rw-r--r--drivers/net/designware.c42
-rw-r--r--drivers/net/phy/micrel.c32
-rw-r--r--drivers/nvmem/eeprom_93xx46.c5
-rw-r--r--drivers/of/of_net.c12
-rw-r--r--drivers/pci/pcie-designware-host.c2
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);