24
24
#define KMSG_COMPONENT "ctcm"
25
25
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
27
#include <linux/kernel_stat.h>
27
28
#include <linux/module.h>
28
29
#include <linux/init.h>
29
30
#include <linux/kernel.h>
247
252
* returns Pointer to a channel or NULL if no matching channel available.
249
static struct channel *channel_get(enum channel_types type,
254
static struct channel *channel_get(enum ctcm_channel_types type,
250
255
char *id, int direction)
252
257
struct channel *ch = channels;
264
269
ch->flags |= CHANNEL_FLAGS_INUSE;
265
270
ch->flags &= ~CHANNEL_FLAGS_RWMASK;
266
ch->flags |= (direction == WRITE)
271
ch->flags |= (direction == CTCM_WRITE)
267
272
? CHANNEL_FLAGS_WRITE : CHANNEL_FLAGS_READ;
268
273
fsm_newstate(ch->fsm, CTC_STATE_STOPPED);
384
389
CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
385
390
"%s(%s): %s trans_skb allocation error",
386
391
CTCM_FUNTAIL, ch->id,
387
(CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
392
(CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ?
395
401
CTCM_DBF_TEXT_(ERROR, CTC_DBF_ERROR,
396
402
"%s(%s): %s set norm_cda failed",
397
403
CTCM_FUNTAIL, ch->id,
398
(CHANNEL_DIRECTION(ch->flags) == READ) ? "RX" : "TX");
404
(CHANNEL_DIRECTION(ch->flags) == CTCM_READ) ?
600
607
priv = dev->ml_priv;
601
608
grp = priv->mpcg;
602
ch = priv->channel[WRITE];
609
ch = priv->channel[CTCM_WRITE];
604
611
/* sweep processing is not complete until response and request */
605
612
/* has completed for all read channels in group */
606
613
if (grp->in_sweep == 0) {
607
614
grp->in_sweep = 1;
608
grp->sweep_rsp_pend_num = grp->active_channels[READ];
609
grp->sweep_req_pend_num = grp->active_channels[READ];
615
grp->sweep_rsp_pend_num = grp->active_channels[CTCM_READ];
616
grp->sweep_req_pend_num = grp->active_channels[CTCM_READ];
612
619
sweep_skb = __dev_alloc_skb(MPC_BUFSIZE_DEFAULT, GFP_ATOMIC|GFP_DMA);
992
999
dev->trans_start = jiffies;
993
if (ctcmpc_transmit_skb(priv->channel[WRITE], skb) != 0) {
1000
if (ctcmpc_transmit_skb(priv->channel[CTCM_WRITE], skb) != 0) {
994
1001
CTCM_DBF_TEXT_(MPC_ERROR, CTC_DBF_ERROR,
995
1002
"%s(%s): device error - dropped",
996
1003
CTCM_FUNTAIL, dev->name);
1148
1155
dev_fsm, dev_fsm_len, GFP_KERNEL);
1149
1156
if (priv->fsm == NULL) {
1150
1157
CTCMY_DBF_DEV(SETUP, dev, "init_fsm error");
1154
1161
fsm_newstate(priv->fsm, DEV_STATE_STOPPED);
1159
1166
grp = ctcmpc_init_mpc_group(priv);
1160
1167
if (grp == NULL) {
1161
1168
MPC_DBF_DEV(SETUP, dev, "init_mpc_group error");
1165
1172
tasklet_init(&grp->mpc_tasklet2,
1208
kstat_cpu(smp_processor_id()).irqs[IOINT_CTC]++;
1201
1209
CTCM_DBF_TEXT_(TRACE, CTC_DBF_DEBUG,
1202
1210
"Enter %s(%s)", CTCM_FUNTAIL, dev_name(&cdev->dev));
1222
1230
priv = dev_get_drvdata(&cgdev->dev);
1224
1232
/* Try to extract channel from driver data. */
1225
if (priv->channel[READ]->cdev == cdev)
1226
ch = priv->channel[READ];
1227
else if (priv->channel[WRITE]->cdev == cdev)
1228
ch = priv->channel[WRITE];
1233
if (priv->channel[CTCM_READ]->cdev == cdev)
1234
ch = priv->channel[CTCM_READ];
1235
else if (priv->channel[CTCM_WRITE]->cdev == cdev)
1236
ch = priv->channel[CTCM_WRITE];
1230
1238
dev_err(&cdev->dev,
1231
1239
"%s: Internal error: Can't determine channel for "
1343
1351
* returns 0 on success, !0 on error.
1345
static int add_channel(struct ccw_device *cdev, enum channel_types type,
1353
static int add_channel(struct ccw_device *cdev, enum ctcm_channel_types type,
1346
1354
struct ctcm_priv *priv)
1348
1356
struct channel **c = &channels;
1361
1369
ch->protocol = priv->protocol;
1362
1370
if (IS_MPC(priv)) {
1363
ch->discontact_th = (struct th_header *)
1364
kzalloc(TH_HEADER_LENGTH, gfp_type());
1371
ch->discontact_th = kzalloc(TH_HEADER_LENGTH, gfp_type());
1365
1372
if (ch->discontact_th == NULL)
1366
1373
goto nomem_return;
1502
1508
* Return type of a detected device.
1504
static enum channel_types get_channel_type(struct ccw_device_id *id)
1510
static enum ctcm_channel_types get_channel_type(struct ccw_device_id *id)
1506
enum channel_types type;
1507
type = (enum channel_types)id->driver_info;
1512
enum ctcm_channel_types type;
1513
type = (enum ctcm_channel_types)id->driver_info;
1509
if (type == channel_type_ficon)
1510
type = channel_type_escon;
1515
if (type == ctcm_channel_type_ficon)
1516
type = ctcm_channel_type_escon;
1525
1531
char read_id[CTCM_ID_SIZE];
1526
1532
char write_id[CTCM_ID_SIZE];
1528
enum channel_types type;
1534
enum ctcm_channel_types type;
1529
1535
struct ctcm_priv *priv;
1530
1536
struct net_device *dev;
1531
1537
struct ccw_device *cdev0;
1532
1538
struct ccw_device *cdev1;
1539
struct channel *readc;
1540
struct channel *writec;
1535
1544
priv = dev_get_drvdata(&cgdev->dev);
1547
goto out_err_result;
1539
1550
cdev0 = cgdev->cdev[0];
1540
1551
cdev1 = cgdev->cdev[1];
1545
1556
snprintf(write_id, CTCM_ID_SIZE, "ch-%s", dev_name(&cdev1->dev));
1547
1558
ret = add_channel(cdev0, type, priv);
1561
goto out_err_result;
1550
1563
ret = add_channel(cdev1, type, priv);
1566
goto out_remove_channel1;
1554
1569
ret = ccw_device_set_online(cdev0);
1555
1570
if (ret != 0) {
1556
/* may be ok to fail now - can be done later */
1557
1571
CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
1558
1572
"%s(%s) set_online rc=%d",
1559
1573
CTCM_FUNTAIL, read_id, ret);
1575
goto out_remove_channel2;
1562
1578
ret = ccw_device_set_online(cdev1);
1563
1579
if (ret != 0) {
1564
/* may be ok to fail now - can be done later */
1565
1580
CTCM_DBF_TEXT_(TRACE, CTC_DBF_NOTICE,
1566
1581
"%s(%s) set_online rc=%d",
1567
1582
CTCM_FUNTAIL, write_id, ret);
1570
1588
dev = ctcm_init_netdevice(priv);
1574
for (direction = READ; direction <= WRITE; direction++) {
1594
for (direction = CTCM_READ; direction <= CTCM_WRITE; direction++) {
1575
1595
priv->channel[direction] =
1576
channel_get(type, direction == READ ? read_id : write_id,
1596
channel_get(type, direction == CTCM_READ ?
1597
read_id : write_id, direction);
1578
1598
if (priv->channel[direction] == NULL) {
1579
if (direction == WRITE)
1580
channel_free(priv->channel[READ]);
1599
if (direction == CTCM_WRITE)
1600
channel_free(priv->channel[CTCM_READ]);
1583
1603
priv->channel[direction]->netdev = dev;
1587
1607
/* sysfs magic */
1588
1608
SET_NETDEV_DEV(dev, &cgdev->dev);
1590
if (register_netdev(dev))
1610
if (register_netdev(dev)) {
1593
1615
if (ctcm_add_attributes(&cgdev->dev)) {
1594
unregister_netdev(dev);
1617
goto out_unregister;
1598
1620
strlcpy(priv->fsm->name, dev->name, sizeof(priv->fsm->name));
1600
1622
dev_info(&dev->dev,
1601
1623
"setup OK : r/w = %s/%s, protocol : %d\n",
1602
priv->channel[READ]->id,
1603
priv->channel[WRITE]->id, priv->protocol);
1624
priv->channel[CTCM_READ]->id,
1625
priv->channel[CTCM_WRITE]->id, priv->protocol);
1605
1627
CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
1606
1628
"setup(%s) OK : r/w = %s/%s, protocol : %d", dev->name,
1607
priv->channel[READ]->id,
1608
priv->channel[WRITE]->id, priv->protocol);
1629
priv->channel[CTCM_READ]->id,
1630
priv->channel[CTCM_WRITE]->id, priv->protocol);
1634
unregister_netdev(dev);
1612
1636
ctcm_free_netdevice(dev);
1614
1638
ccw_device_set_offline(cgdev->cdev[1]);
1615
1640
ccw_device_set_offline(cgdev->cdev[0]);
1641
out_remove_channel2:
1642
readc = channel_get(type, read_id, CTCM_READ);
1643
channel_remove(readc);
1644
out_remove_channel1:
1645
writec = channel_get(type, write_id, CTCM_WRITE);
1646
channel_remove(writec);
1634
1665
return -ENODEV;
1636
if (priv->channel[READ]) {
1637
dev = priv->channel[READ]->netdev;
1667
if (priv->channel[CTCM_READ]) {
1668
dev = priv->channel[CTCM_READ]->netdev;
1638
1669
CTCM_DBF_DEV(SETUP, dev, "");
1639
1670
/* Close the device */
1640
1671
ctcm_close(dev);
1641
1672
dev->flags &= ~IFF_RUNNING;
1642
1673
ctcm_remove_attributes(&cgdev->dev);
1643
channel_free(priv->channel[READ]);
1674
channel_free(priv->channel[CTCM_READ]);
1647
if (priv->channel[WRITE])
1648
channel_free(priv->channel[WRITE]);
1678
if (priv->channel[CTCM_WRITE])
1679
channel_free(priv->channel[CTCM_WRITE]);
1651
1682
unregister_netdev(dev);
1658
1689
ccw_device_set_offline(cgdev->cdev[1]);
1659
1690
ccw_device_set_offline(cgdev->cdev[0]);
1661
if (priv->channel[READ])
1662
channel_remove(priv->channel[READ]);
1663
if (priv->channel[WRITE])
1664
channel_remove(priv->channel[WRITE]);
1665
priv->channel[READ] = priv->channel[WRITE] = NULL;
1692
if (priv->channel[CTCM_READ])
1693
channel_remove(priv->channel[CTCM_READ]);
1694
if (priv->channel[CTCM_WRITE])
1695
channel_remove(priv->channel[CTCM_WRITE]);
1696
priv->channel[CTCM_READ] = priv->channel[CTCM_WRITE] = NULL;
1694
1725
if (gdev->state == CCWGROUP_OFFLINE)
1696
netif_device_detach(priv->channel[READ]->netdev);
1697
ctcm_close(priv->channel[READ]->netdev);
1727
netif_device_detach(priv->channel[CTCM_READ]->netdev);
1728
ctcm_close(priv->channel[CTCM_READ]->netdev);
1729
if (!wait_event_timeout(priv->fsm->wait_q,
1730
fsm_getstate(priv->fsm) == DEV_STATE_STOPPED, CTCM_TIME_5_SEC)) {
1731
netif_device_attach(priv->channel[CTCM_READ]->netdev);
1698
1734
ccw_device_set_offline(gdev->cdev[1]);
1699
1735
ccw_device_set_offline(gdev->cdev[0]);
1713
1749
rc = ccw_device_set_online(gdev->cdev[0]);
1716
ctcm_open(priv->channel[READ]->netdev);
1752
ctcm_open(priv->channel[CTCM_READ]->netdev);
1718
netif_device_attach(priv->channel[READ]->netdev);
1754
netif_device_attach(priv->channel[CTCM_READ]->netdev);
1758
static struct ccw_device_id ctcm_ids[] = {
1759
{CCW_DEVICE(0x3088, 0x08), .driver_info = ctcm_channel_type_parallel},
1760
{CCW_DEVICE(0x3088, 0x1e), .driver_info = ctcm_channel_type_ficon},
1761
{CCW_DEVICE(0x3088, 0x1f), .driver_info = ctcm_channel_type_escon},
1764
MODULE_DEVICE_TABLE(ccw, ctcm_ids);
1766
static struct ccw_driver ctcm_ccw_driver = {
1767
.owner = THIS_MODULE,
1770
.probe = ccwgroup_probe_ccwdev,
1771
.remove = ccwgroup_remove_ccwdev,
1722
1774
static struct ccwgroup_driver ctcm_group_driver = {
1723
1775
.owner = THIS_MODULE,
1724
1776
.name = CTC_DRIVER_NAME,
1733
1785
.restore = ctcm_pm_resume,
1789
ctcm_driver_group_store(struct device_driver *ddrv, const char *buf,
1794
err = ccwgroup_create_from_string(ctcm_root_dev,
1795
ctcm_group_driver.driver_id,
1796
&ctcm_ccw_driver, 2, buf);
1797
return err ? err : count;
1800
static DRIVER_ATTR(group, 0200, NULL, ctcm_driver_group_store);
1802
static struct attribute *ctcm_group_attrs[] = {
1803
&driver_attr_group.attr,
1807
static struct attribute_group ctcm_group_attr_group = {
1808
.attrs = ctcm_group_attrs,
1811
static const struct attribute_group *ctcm_group_attr_groups[] = {
1812
&ctcm_group_attr_group,
1738
1817
* Module related routines
1747
1826
static void __exit ctcm_exit(void)
1749
unregister_cu3088_discipline(&ctcm_group_driver);
1828
driver_remove_file(&ctcm_group_driver.driver, &driver_attr_group);
1829
ccwgroup_driver_unregister(&ctcm_group_driver);
1830
ccw_driver_unregister(&ctcm_ccw_driver);
1831
root_device_unregister(ctcm_root_dev);
1750
1832
ctcm_unregister_dbf_views();
1751
1833
pr_info("CTCM driver unloaded\n");
1772
1854
channels = NULL;
1774
1856
ret = ctcm_register_dbf_views();
1778
ret = register_cu3088_discipline(&ctcm_group_driver);
1780
ctcm_unregister_dbf_views();
1781
pr_err("%s / register_cu3088_discipline failed, ret = %d\n",
1859
ctcm_root_dev = root_device_register("ctcm");
1860
ret = IS_ERR(ctcm_root_dev) ? PTR_ERR(ctcm_root_dev) : 0;
1863
ret = ccw_driver_register(&ctcm_ccw_driver);
1866
ctcm_group_driver.driver.groups = ctcm_group_attr_groups;
1867
ret = ccwgroup_driver_register(&ctcm_group_driver);
1785
1870
print_banner();
1874
ccw_driver_unregister(&ctcm_ccw_driver);
1876
root_device_unregister(ctcm_root_dev);
1878
ctcm_unregister_dbf_views();
1880
pr_err("%s / Initializing the ctcm device driver failed, ret = %d\n",