0001
0002
0003
0004
0005
0006
0007
0008
0009 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0010
0011 #include <linux/interrupt.h>
0012 #include <linux/module.h>
0013 #include <linux/kernel.h>
0014 #include <linux/netdevice.h>
0015 #include <linux/etherdevice.h>
0016 #include <linux/ethtool.h>
0017 #include <linux/iopoll.h>
0018 #include <linux/mii.h>
0019
0020 #include <linux/platform_device.h>
0021 #include <linux/of_net.h>
0022
0023 #include "ks8851.h"
0024
0025 static int msg_enable;
0026
0027 #define BE3 0x8000
0028 #define BE2 0x4000
0029 #define BE1 0x2000
0030 #define BE0 0x1000
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 struct ks8851_net_par {
0046 struct ks8851_net ks8851;
0047 spinlock_t lock;
0048 void __iomem *hw_addr;
0049 void __iomem *hw_addr_cmd;
0050 u16 cmd_reg_cache;
0051 };
0052
0053 #define to_ks8851_par(ks) container_of((ks), struct ks8851_net_par, ks8851)
0054
0055
0056
0057
0058
0059
0060
0061
0062 static void ks8851_lock_par(struct ks8851_net *ks, unsigned long *flags)
0063 {
0064 struct ks8851_net_par *ksp = to_ks8851_par(ks);
0065
0066 spin_lock_irqsave(&ksp->lock, *flags);
0067 }
0068
0069
0070
0071
0072
0073
0074
0075
0076 static void ks8851_unlock_par(struct ks8851_net *ks, unsigned long *flags)
0077 {
0078 struct ks8851_net_par *ksp = to_ks8851_par(ks);
0079
0080 spin_unlock_irqrestore(&ksp->lock, *flags);
0081 }
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 static int ks_check_endian(struct ks8851_net *ks)
0092 {
0093 struct ks8851_net_par *ksp = to_ks8851_par(ks);
0094 u16 cider;
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 iowrite16(BE3 | BE2 | KS_CIDER, ksp->hw_addr_cmd);
0118 cider = ioread16(ksp->hw_addr);
0119 if (!cider)
0120 return 0;
0121
0122 netdev_err(ks->netdev, "incorrect EESK endian strap setting\n");
0123
0124 return -EINVAL;
0125 }
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135 static void ks8851_wrreg16_par(struct ks8851_net *ks, unsigned int reg,
0136 unsigned int val)
0137 {
0138 struct ks8851_net_par *ksp = to_ks8851_par(ks);
0139
0140 ksp->cmd_reg_cache = (u16)reg | ((BE1 | BE0) << (reg & 0x02));
0141 iowrite16(ksp->cmd_reg_cache, ksp->hw_addr_cmd);
0142 iowrite16(val, ksp->hw_addr);
0143 }
0144
0145
0146
0147
0148
0149
0150
0151
0152 static unsigned int ks8851_rdreg16_par(struct ks8851_net *ks, unsigned int reg)
0153 {
0154 struct ks8851_net_par *ksp = to_ks8851_par(ks);
0155
0156 ksp->cmd_reg_cache = (u16)reg | ((BE1 | BE0) << (reg & 0x02));
0157 iowrite16(ksp->cmd_reg_cache, ksp->hw_addr_cmd);
0158 return ioread16(ksp->hw_addr);
0159 }
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170 static void ks8851_rdfifo_par(struct ks8851_net *ks, u8 *buff, unsigned int len)
0171 {
0172 struct ks8851_net_par *ksp = to_ks8851_par(ks);
0173
0174 netif_dbg(ks, rx_status, ks->netdev,
0175 "%s: %d@%p\n", __func__, len, buff);
0176
0177 ioread16_rep(ksp->hw_addr, (u16 *)buff + 1, len / 2);
0178 }
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191 static void ks8851_wrfifo_par(struct ks8851_net *ks, struct sk_buff *txp,
0192 bool irq)
0193 {
0194 struct ks8851_net_par *ksp = to_ks8851_par(ks);
0195 unsigned int len = ALIGN(txp->len, 4);
0196 unsigned int fid = 0;
0197
0198 netif_dbg(ks, tx_queued, ks->netdev, "%s: skb %p, %d@%p, irq %d\n",
0199 __func__, txp, txp->len, txp->data, irq);
0200
0201 fid = ks->fid++;
0202 fid &= TXFR_TXFID_MASK;
0203
0204 if (irq)
0205 fid |= TXFR_TXIC;
0206
0207 iowrite16(fid, ksp->hw_addr);
0208 iowrite16(txp->len, ksp->hw_addr);
0209
0210 iowrite16_rep(ksp->hw_addr, txp->data, len / 2);
0211 }
0212
0213
0214
0215
0216
0217
0218 static void ks8851_rx_skb_par(struct ks8851_net *ks, struct sk_buff *skb)
0219 {
0220 netif_rx(skb);
0221 }
0222
0223 static unsigned int ks8851_rdreg16_par_txqcr(struct ks8851_net *ks)
0224 {
0225 return ks8851_rdreg16_par(ks, KS_TXQCR);
0226 }
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241 static netdev_tx_t ks8851_start_xmit_par(struct sk_buff *skb,
0242 struct net_device *dev)
0243 {
0244 struct ks8851_net *ks = netdev_priv(dev);
0245 netdev_tx_t ret = NETDEV_TX_OK;
0246 unsigned long flags;
0247 unsigned int txqcr;
0248 u16 txmir;
0249 int err;
0250
0251 netif_dbg(ks, tx_queued, ks->netdev,
0252 "%s: skb %p, %d@%p\n", __func__, skb, skb->len, skb->data);
0253
0254 ks8851_lock_par(ks, &flags);
0255
0256 txmir = ks8851_rdreg16_par(ks, KS_TXMIR) & 0x1fff;
0257
0258 if (likely(txmir >= skb->len + 12)) {
0259 ks8851_wrreg16_par(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA);
0260 ks8851_wrfifo_par(ks, skb, false);
0261 ks8851_wrreg16_par(ks, KS_RXQCR, ks->rc_rxqcr);
0262 ks8851_wrreg16_par(ks, KS_TXQCR, TXQCR_METFE);
0263
0264 err = readx_poll_timeout_atomic(ks8851_rdreg16_par_txqcr, ks,
0265 txqcr, !(txqcr & TXQCR_METFE),
0266 5, 1000000);
0267 if (err)
0268 ret = NETDEV_TX_BUSY;
0269
0270 ks8851_done_tx(ks, skb);
0271 } else {
0272 ret = NETDEV_TX_BUSY;
0273 }
0274
0275 ks8851_unlock_par(ks, &flags);
0276
0277 return ret;
0278 }
0279
0280 static int ks8851_probe_par(struct platform_device *pdev)
0281 {
0282 struct device *dev = &pdev->dev;
0283 struct ks8851_net_par *ksp;
0284 struct net_device *netdev;
0285 struct ks8851_net *ks;
0286 int ret;
0287
0288 netdev = devm_alloc_etherdev(dev, sizeof(struct ks8851_net_par));
0289 if (!netdev)
0290 return -ENOMEM;
0291
0292 ks = netdev_priv(netdev);
0293
0294 ks->lock = ks8851_lock_par;
0295 ks->unlock = ks8851_unlock_par;
0296 ks->rdreg16 = ks8851_rdreg16_par;
0297 ks->wrreg16 = ks8851_wrreg16_par;
0298 ks->rdfifo = ks8851_rdfifo_par;
0299 ks->wrfifo = ks8851_wrfifo_par;
0300 ks->start_xmit = ks8851_start_xmit_par;
0301 ks->rx_skb = ks8851_rx_skb_par;
0302
0303 #define STD_IRQ (IRQ_LCI | \
0304 IRQ_RXI | \
0305 IRQ_RXPSI)
0306 ks->rc_ier = STD_IRQ;
0307
0308 ksp = to_ks8851_par(ks);
0309 spin_lock_init(&ksp->lock);
0310
0311 ksp->hw_addr = devm_platform_ioremap_resource(pdev, 0);
0312 if (IS_ERR(ksp->hw_addr))
0313 return PTR_ERR(ksp->hw_addr);
0314
0315 ksp->hw_addr_cmd = devm_platform_ioremap_resource(pdev, 1);
0316 if (IS_ERR(ksp->hw_addr_cmd))
0317 return PTR_ERR(ksp->hw_addr_cmd);
0318
0319 ret = ks_check_endian(ks);
0320 if (ret)
0321 return ret;
0322
0323 netdev->irq = platform_get_irq(pdev, 0);
0324 if (netdev->irq < 0)
0325 return netdev->irq;
0326
0327 return ks8851_probe_common(netdev, dev, msg_enable);
0328 }
0329
0330 static int ks8851_remove_par(struct platform_device *pdev)
0331 {
0332 ks8851_remove_common(&pdev->dev);
0333
0334 return 0;
0335 }
0336
0337 static const struct of_device_id ks8851_match_table[] = {
0338 { .compatible = "micrel,ks8851-mll" },
0339 { }
0340 };
0341 MODULE_DEVICE_TABLE(of, ks8851_match_table);
0342
0343 static struct platform_driver ks8851_driver = {
0344 .driver = {
0345 .name = "ks8851",
0346 .of_match_table = ks8851_match_table,
0347 .pm = &ks8851_pm_ops,
0348 },
0349 .probe = ks8851_probe_par,
0350 .remove = ks8851_remove_par,
0351 };
0352 module_platform_driver(ks8851_driver);
0353
0354 MODULE_DESCRIPTION("KS8851 Network driver");
0355 MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
0356 MODULE_LICENSE("GPL");
0357
0358 module_param_named(message, msg_enable, int, 0);
0359 MODULE_PARM_DESC(message, "Message verbosity level (0=none, 31=all)");