qeth_l2_main.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234
  1. /*
  2. * drivers/s390/net/qeth_l2_main.c
  3. *
  4. * Copyright IBM Corp. 2007
  5. * Author(s): Utz Bacher <utz.bacher@de.ibm.com>,
  6. * Frank Pavlic <fpavlic@de.ibm.com>,
  7. * Thomas Spatzier <tspat@de.ibm.com>,
  8. * Frank Blaschka <frank.blaschka@de.ibm.com>
  9. */
  10. #include <linux/module.h>
  11. #include <linux/moduleparam.h>
  12. #include <linux/string.h>
  13. #include <linux/errno.h>
  14. #include <linux/kernel.h>
  15. #include <linux/etherdevice.h>
  16. #include <linux/mii.h>
  17. #include <linux/ip.h>
  18. #include <asm/s390_rdev.h>
  19. #include "qeth_core.h"
  20. #include "qeth_core_offl.h"
  21. #define QETH_DBF_TXT_BUF qeth_l2_dbf_txt_buf
  22. static DEFINE_PER_CPU(char[256], qeth_l2_dbf_txt_buf);
  23. static int qeth_l2_set_offline(struct ccwgroup_device *);
  24. static int qeth_l2_stop(struct net_device *);
  25. static int qeth_l2_send_delmac(struct qeth_card *, __u8 *);
  26. static int qeth_l2_send_setdelmac(struct qeth_card *, __u8 *,
  27. enum qeth_ipa_cmds,
  28. int (*reply_cb) (struct qeth_card *,
  29. struct qeth_reply*,
  30. unsigned long));
  31. static void qeth_l2_set_multicast_list(struct net_device *);
  32. static int qeth_l2_recover(void *);
  33. static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
  34. {
  35. struct qeth_card *card = netdev_priv(dev);
  36. struct mii_ioctl_data *mii_data;
  37. int rc = 0;
  38. if (!card)
  39. return -ENODEV;
  40. if ((card->state != CARD_STATE_UP) &&
  41. (card->state != CARD_STATE_SOFTSETUP))
  42. return -ENODEV;
  43. if (card->info.type == QETH_CARD_TYPE_OSN)
  44. return -EPERM;
  45. switch (cmd) {
  46. case SIOC_QETH_ADP_SET_SNMP_CONTROL:
  47. rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data);
  48. break;
  49. case SIOC_QETH_GET_CARD_TYPE:
  50. if ((card->info.type == QETH_CARD_TYPE_OSAE) &&
  51. !card->info.guestlan)
  52. return 1;
  53. return 0;
  54. break;
  55. case SIOCGMIIPHY:
  56. mii_data = if_mii(rq);
  57. mii_data->phy_id = 0;
  58. break;
  59. case SIOCGMIIREG:
  60. mii_data = if_mii(rq);
  61. if (mii_data->phy_id != 0)
  62. rc = -EINVAL;
  63. else
  64. mii_data->val_out = qeth_mdio_read(dev,
  65. mii_data->phy_id, mii_data->reg_num);
  66. break;
  67. default:
  68. rc = -EOPNOTSUPP;
  69. }
  70. if (rc)
  71. QETH_DBF_TEXT_(TRACE, 2, "ioce%d", rc);
  72. return rc;
  73. }
  74. static int qeth_l2_verify_dev(struct net_device *dev)
  75. {
  76. struct qeth_card *card;
  77. unsigned long flags;
  78. int rc = 0;
  79. read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
  80. list_for_each_entry(card, &qeth_core_card_list.list, list) {
  81. if (card->dev == dev) {
  82. rc = QETH_REAL_CARD;
  83. break;
  84. }
  85. }
  86. read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
  87. return rc;
  88. }
  89. static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no)
  90. {
  91. struct qeth_card *card;
  92. struct net_device *ndev;
  93. unsigned char *readno;
  94. __u16 temp_dev_no, card_dev_no;
  95. char *endp;
  96. unsigned long flags;
  97. ndev = NULL;
  98. memcpy(&temp_dev_no, read_dev_no, 2);
  99. read_lock_irqsave(&qeth_core_card_list.rwlock, flags);
  100. list_for_each_entry(card, &qeth_core_card_list.list, list) {
  101. readno = CARD_RDEV_ID(card);
  102. readno += (strlen(readno) - 4);
  103. card_dev_no = simple_strtoul(readno, &endp, 16);
  104. if (card_dev_no == temp_dev_no) {
  105. ndev = card->dev;
  106. break;
  107. }
  108. }
  109. read_unlock_irqrestore(&qeth_core_card_list.rwlock, flags);
  110. return ndev;
  111. }
  112. static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card,
  113. struct qeth_reply *reply,
  114. unsigned long data)
  115. {
  116. struct qeth_ipa_cmd *cmd;
  117. __u8 *mac;
  118. QETH_DBF_TEXT(TRACE, 2, "L2Sgmacb");
  119. cmd = (struct qeth_ipa_cmd *) data;
  120. mac = &cmd->data.setdelmac.mac[0];
  121. /* MAC already registered, needed in couple/uncouple case */
  122. if (cmd->hdr.return_code == 0x2005) {
  123. PRINT_WARN("Group MAC %02x:%02x:%02x:%02x:%02x:%02x " \
  124. "already existing on %s \n",
  125. mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
  126. QETH_CARD_IFNAME(card));
  127. cmd->hdr.return_code = 0;
  128. }
  129. if (cmd->hdr.return_code)
  130. PRINT_ERR("Could not set group MAC " \
  131. "%02x:%02x:%02x:%02x:%02x:%02x on %s: %x\n",
  132. mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
  133. QETH_CARD_IFNAME(card), cmd->hdr.return_code);
  134. return 0;
  135. }
  136. static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac)
  137. {
  138. QETH_DBF_TEXT(TRACE, 2, "L2Sgmac");
  139. return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETGMAC,
  140. qeth_l2_send_setgroupmac_cb);
  141. }
  142. static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card,
  143. struct qeth_reply *reply,
  144. unsigned long data)
  145. {
  146. struct qeth_ipa_cmd *cmd;
  147. __u8 *mac;
  148. QETH_DBF_TEXT(TRACE, 2, "L2Dgmacb");
  149. cmd = (struct qeth_ipa_cmd *) data;
  150. mac = &cmd->data.setdelmac.mac[0];
  151. if (cmd->hdr.return_code)
  152. PRINT_ERR("Could not delete group MAC " \
  153. "%02x:%02x:%02x:%02x:%02x:%02x on %s: %x\n",
  154. mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
  155. QETH_CARD_IFNAME(card), cmd->hdr.return_code);
  156. return 0;
  157. }
  158. static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac)
  159. {
  160. QETH_DBF_TEXT(TRACE, 2, "L2Dgmac");
  161. return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELGMAC,
  162. qeth_l2_send_delgroupmac_cb);
  163. }
  164. static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac)
  165. {
  166. struct qeth_mc_mac *mc;
  167. mc = kmalloc(sizeof(struct qeth_mc_mac), GFP_ATOMIC);
  168. if (!mc) {
  169. PRINT_ERR("no mem vor mc mac address\n");
  170. return;
  171. }
  172. memcpy(mc->mc_addr, mac, OSA_ADDR_LEN);
  173. mc->mc_addrlen = OSA_ADDR_LEN;
  174. if (!qeth_l2_send_setgroupmac(card, mac))
  175. list_add_tail(&mc->list, &card->mc_list);
  176. else
  177. kfree(mc);
  178. }
  179. static void qeth_l2_del_all_mc(struct qeth_card *card)
  180. {
  181. struct qeth_mc_mac *mc, *tmp;
  182. spin_lock_bh(&card->mclock);
  183. list_for_each_entry_safe(mc, tmp, &card->mc_list, list) {
  184. qeth_l2_send_delgroupmac(card, mc->mc_addr);
  185. list_del(&mc->list);
  186. kfree(mc);
  187. }
  188. spin_unlock_bh(&card->mclock);
  189. }
  190. static void qeth_l2_get_packet_type(struct qeth_card *card,
  191. struct qeth_hdr *hdr, struct sk_buff *skb)
  192. {
  193. __u16 hdr_mac;
  194. if (!memcmp(skb->data + QETH_HEADER_SIZE,
  195. skb->dev->broadcast, 6)) {
  196. /* broadcast? */
  197. hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
  198. return;
  199. }
  200. hdr_mac = *((__u16 *)skb->data);
  201. /* tr multicast? */
  202. switch (card->info.link_type) {
  203. case QETH_LINK_TYPE_HSTR:
  204. case QETH_LINK_TYPE_LANE_TR:
  205. if ((hdr_mac == QETH_TR_MAC_NC) ||
  206. (hdr_mac == QETH_TR_MAC_C))
  207. hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
  208. else
  209. hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
  210. break;
  211. /* eth or so multicast? */
  212. default:
  213. if ((hdr_mac == QETH_ETH_MAC_V4) ||
  214. (hdr_mac == QETH_ETH_MAC_V6))
  215. hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
  216. else
  217. hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
  218. }
  219. }
  220. static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
  221. struct sk_buff *skb, int ipv, int cast_type)
  222. {
  223. struct vlan_ethhdr *veth = (struct vlan_ethhdr *)((skb->data) +
  224. QETH_HEADER_SIZE);
  225. memset(hdr, 0, sizeof(struct qeth_hdr));
  226. hdr->hdr.l2.id = QETH_HEADER_TYPE_LAYER2;
  227. /* set byte byte 3 to casting flags */
  228. if (cast_type == RTN_MULTICAST)
  229. hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
  230. else if (cast_type == RTN_BROADCAST)
  231. hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
  232. else
  233. qeth_l2_get_packet_type(card, hdr, skb);
  234. hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE;
  235. /* VSWITCH relies on the VLAN
  236. * information to be present in
  237. * the QDIO header */
  238. if (veth->h_vlan_proto == __constant_htons(ETH_P_8021Q)) {
  239. hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_VLAN;
  240. hdr->hdr.l2.vlan_id = ntohs(veth->h_vlan_TCI);
  241. }
  242. }
  243. static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,
  244. struct qeth_reply *reply, unsigned long data)
  245. {
  246. struct qeth_ipa_cmd *cmd;
  247. QETH_DBF_TEXT(TRACE, 2, "L2sdvcb");
  248. cmd = (struct qeth_ipa_cmd *) data;
  249. if (cmd->hdr.return_code) {
  250. PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. "
  251. "Continuing\n", cmd->data.setdelvlan.vlan_id,
  252. QETH_CARD_IFNAME(card), cmd->hdr.return_code);
  253. QETH_DBF_TEXT_(TRACE, 2, "L2VL%4x", cmd->hdr.command);
  254. QETH_DBF_TEXT_(TRACE, 2, "L2%s", CARD_BUS_ID(card));
  255. QETH_DBF_TEXT_(TRACE, 2, "err%d", cmd->hdr.return_code);
  256. }
  257. return 0;
  258. }
  259. static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,
  260. enum qeth_ipa_cmds ipacmd)
  261. {
  262. struct qeth_ipa_cmd *cmd;
  263. struct qeth_cmd_buffer *iob;
  264. QETH_DBF_TEXT_(TRACE, 4, "L2sdv%x", ipacmd);
  265. iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
  266. cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
  267. cmd->data.setdelvlan.vlan_id = i;
  268. return qeth_send_ipa_cmd(card, iob,
  269. qeth_l2_send_setdelvlan_cb, NULL);
  270. }
  271. static void qeth_l2_process_vlans(struct qeth_card *card, int clear)
  272. {
  273. struct qeth_vlan_vid *id;
  274. QETH_DBF_TEXT(TRACE, 3, "L2prcvln");
  275. spin_lock_bh(&card->vlanlock);
  276. list_for_each_entry(id, &card->vid_list, list) {
  277. if (clear)
  278. qeth_l2_send_setdelvlan(card, id->vid,
  279. IPA_CMD_DELVLAN);
  280. else
  281. qeth_l2_send_setdelvlan(card, id->vid,
  282. IPA_CMD_SETVLAN);
  283. }
  284. spin_unlock_bh(&card->vlanlock);
  285. }
  286. static void qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
  287. {
  288. struct qeth_card *card = netdev_priv(dev);
  289. struct qeth_vlan_vid *id;
  290. QETH_DBF_TEXT_(TRACE, 4, "aid:%d", vid);
  291. id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC);
  292. if (id) {
  293. id->vid = vid;
  294. qeth_l2_send_setdelvlan(card, vid, IPA_CMD_SETVLAN);
  295. spin_lock_bh(&card->vlanlock);
  296. list_add_tail(&id->list, &card->vid_list);
  297. spin_unlock_bh(&card->vlanlock);
  298. } else {
  299. PRINT_ERR("no memory for vid\n");
  300. }
  301. }
  302. static void qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
  303. {
  304. struct qeth_vlan_vid *id, *tmpid = NULL;
  305. struct qeth_card *card = netdev_priv(dev);
  306. QETH_DBF_TEXT_(TRACE, 4, "kid:%d", vid);
  307. spin_lock_bh(&card->vlanlock);
  308. list_for_each_entry(id, &card->vid_list, list) {
  309. if (id->vid == vid) {
  310. list_del(&id->list);
  311. tmpid = id;
  312. break;
  313. }
  314. }
  315. spin_unlock_bh(&card->vlanlock);
  316. if (tmpid) {
  317. qeth_l2_send_setdelvlan(card, vid, IPA_CMD_DELVLAN);
  318. kfree(tmpid);
  319. }
  320. qeth_l2_set_multicast_list(card->dev);
  321. }
  322. static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
  323. {
  324. int rc = 0;
  325. QETH_DBF_TEXT(SETUP , 2, "stopcard");
  326. QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
  327. qeth_set_allowed_threads(card, 0, 1);
  328. if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD))
  329. return -ERESTARTSYS;
  330. if (card->read.state == CH_STATE_UP &&
  331. card->write.state == CH_STATE_UP &&
  332. (card->state == CARD_STATE_UP)) {
  333. if (recovery_mode &&
  334. card->info.type != QETH_CARD_TYPE_OSN) {
  335. qeth_l2_stop(card->dev);
  336. } else {
  337. rtnl_lock();
  338. dev_close(card->dev);
  339. rtnl_unlock();
  340. }
  341. if (!card->use_hard_stop) {
  342. __u8 *mac = &card->dev->dev_addr[0];
  343. rc = qeth_l2_send_delmac(card, mac);
  344. QETH_DBF_TEXT_(SETUP, 2, "Lerr%d", rc);
  345. }
  346. card->state = CARD_STATE_SOFTSETUP;
  347. }
  348. if (card->state == CARD_STATE_SOFTSETUP) {
  349. qeth_l2_process_vlans(card, 1);
  350. qeth_l2_del_all_mc(card);
  351. qeth_clear_ipacmd_list(card);
  352. card->state = CARD_STATE_HARDSETUP;
  353. }
  354. if (card->state == CARD_STATE_HARDSETUP) {
  355. qeth_qdio_clear_card(card, 0);
  356. qeth_clear_qdio_buffers(card);
  357. qeth_clear_working_pool_list(card);
  358. card->state = CARD_STATE_DOWN;
  359. }
  360. if (card->state == CARD_STATE_DOWN) {
  361. qeth_clear_cmd_buffers(&card->read);
  362. qeth_clear_cmd_buffers(&card->write);
  363. }
  364. card->use_hard_stop = 0;
  365. return rc;
  366. }
  367. static void qeth_l2_process_inbound_buffer(struct qeth_card *card,
  368. struct qeth_qdio_buffer *buf, int index)
  369. {
  370. struct qdio_buffer_element *element;
  371. struct sk_buff *skb;
  372. struct qeth_hdr *hdr;
  373. int offset;
  374. unsigned int len;
  375. /* get first element of current buffer */
  376. element = (struct qdio_buffer_element *)&buf->buffer->element[0];
  377. offset = 0;
  378. if (card->options.performance_stats)
  379. card->perf_stats.bufs_rec++;
  380. while ((skb = qeth_core_get_next_skb(card, buf->buffer, &element,
  381. &offset, &hdr))) {
  382. skb->dev = card->dev;
  383. /* is device UP ? */
  384. if (!(card->dev->flags & IFF_UP)) {
  385. dev_kfree_skb_any(skb);
  386. continue;
  387. }
  388. switch (hdr->hdr.l2.id) {
  389. case QETH_HEADER_TYPE_LAYER2:
  390. skb->pkt_type = PACKET_HOST;
  391. skb->protocol = eth_type_trans(skb, skb->dev);
  392. if (card->options.checksum_type == NO_CHECKSUMMING)
  393. skb->ip_summed = CHECKSUM_UNNECESSARY;
  394. else
  395. skb->ip_summed = CHECKSUM_NONE;
  396. if (skb->protocol == htons(ETH_P_802_2))
  397. *((__u32 *)skb->cb) = ++card->seqno.pkt_seqno;
  398. len = skb->len;
  399. netif_rx(skb);
  400. break;
  401. case QETH_HEADER_TYPE_OSN:
  402. skb_push(skb, sizeof(struct qeth_hdr));
  403. skb_copy_to_linear_data(skb, hdr,
  404. sizeof(struct qeth_hdr));
  405. len = skb->len;
  406. card->osn_info.data_cb(skb);
  407. break;
  408. default:
  409. dev_kfree_skb_any(skb);
  410. QETH_DBF_TEXT(TRACE, 3, "inbunkno");
  411. QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN);
  412. continue;
  413. }
  414. card->dev->last_rx = jiffies;
  415. card->stats.rx_packets++;
  416. card->stats.rx_bytes += len;
  417. }
  418. }
  419. static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac,
  420. enum qeth_ipa_cmds ipacmd,
  421. int (*reply_cb) (struct qeth_card *,
  422. struct qeth_reply*,
  423. unsigned long))
  424. {
  425. struct qeth_ipa_cmd *cmd;
  426. struct qeth_cmd_buffer *iob;
  427. QETH_DBF_TEXT(TRACE, 2, "L2sdmac");
  428. iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
  429. cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
  430. cmd->data.setdelmac.mac_length = OSA_ADDR_LEN;
  431. memcpy(&cmd->data.setdelmac.mac, mac, OSA_ADDR_LEN);
  432. return qeth_send_ipa_cmd(card, iob, reply_cb, NULL);
  433. }
  434. static int qeth_l2_send_setmac_cb(struct qeth_card *card,
  435. struct qeth_reply *reply,
  436. unsigned long data)
  437. {
  438. struct qeth_ipa_cmd *cmd;
  439. QETH_DBF_TEXT(TRACE, 2, "L2Smaccb");
  440. cmd = (struct qeth_ipa_cmd *) data;
  441. if (cmd->hdr.return_code) {
  442. QETH_DBF_TEXT_(TRACE, 2, "L2er%x", cmd->hdr.return_code);
  443. card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
  444. cmd->hdr.return_code = -EIO;
  445. } else {
  446. card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED;
  447. memcpy(card->dev->dev_addr, cmd->data.setdelmac.mac,
  448. OSA_ADDR_LEN);
  449. PRINT_INFO("MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x "
  450. "successfully registered on device %s\n",
  451. card->dev->dev_addr[0], card->dev->dev_addr[1],
  452. card->dev->dev_addr[2], card->dev->dev_addr[3],
  453. card->dev->dev_addr[4], card->dev->dev_addr[5],
  454. card->dev->name);
  455. }
  456. return 0;
  457. }
  458. static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac)
  459. {
  460. QETH_DBF_TEXT(TRACE, 2, "L2Setmac");
  461. return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC,
  462. qeth_l2_send_setmac_cb);
  463. }
  464. static int qeth_l2_send_delmac_cb(struct qeth_card *card,
  465. struct qeth_reply *reply,
  466. unsigned long data)
  467. {
  468. struct qeth_ipa_cmd *cmd;
  469. QETH_DBF_TEXT(TRACE, 2, "L2Dmaccb");
  470. cmd = (struct qeth_ipa_cmd *) data;
  471. if (cmd->hdr.return_code) {
  472. QETH_DBF_TEXT_(TRACE, 2, "err%d", cmd->hdr.return_code);
  473. cmd->hdr.return_code = -EIO;
  474. return 0;
  475. }
  476. card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
  477. return 0;
  478. }
  479. static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac)
  480. {
  481. QETH_DBF_TEXT(TRACE, 2, "L2Delmac");
  482. if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))
  483. return 0;
  484. return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELVMAC,
  485. qeth_l2_send_delmac_cb);
  486. }
  487. static int qeth_l2_request_initial_mac(struct qeth_card *card)
  488. {
  489. int rc = 0;
  490. char vendor_pre[] = {0x02, 0x00, 0x00};
  491. QETH_DBF_TEXT(SETUP, 2, "doL2init");
  492. QETH_DBF_TEXT_(SETUP, 2, "doL2%s", CARD_BUS_ID(card));
  493. rc = qeth_query_setadapterparms(card);
  494. if (rc) {
  495. PRINT_WARN("could not query adapter parameters on device %s: "
  496. "x%x\n", CARD_BUS_ID(card), rc);
  497. }
  498. if (card->info.guestlan) {
  499. rc = qeth_setadpparms_change_macaddr(card);
  500. if (rc) {
  501. PRINT_WARN("couldn't get MAC address on "
  502. "device %s: x%x\n",
  503. CARD_BUS_ID(card), rc);
  504. QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
  505. return rc;
  506. }
  507. QETH_DBF_HEX(SETUP, 2, card->dev->dev_addr, OSA_ADDR_LEN);
  508. } else {
  509. random_ether_addr(card->dev->dev_addr);
  510. memcpy(card->dev->dev_addr, vendor_pre, 3);
  511. }
  512. return 0;
  513. }
  514. static int qeth_l2_set_mac_address(struct net_device *dev, void *p)
  515. {
  516. struct sockaddr *addr = p;
  517. struct qeth_card *card = netdev_priv(dev);
  518. int rc = 0;
  519. QETH_DBF_TEXT(TRACE, 3, "setmac");
  520. if (qeth_l2_verify_dev(dev) != QETH_REAL_CARD) {
  521. QETH_DBF_TEXT(TRACE, 3, "setmcINV");
  522. return -EOPNOTSUPP;
  523. }
  524. if (card->info.type == QETH_CARD_TYPE_OSN) {
  525. PRINT_WARN("Setting MAC address on %s is not supported.\n",
  526. dev->name);
  527. QETH_DBF_TEXT(TRACE, 3, "setmcOSN");
  528. return -EOPNOTSUPP;
  529. }
  530. QETH_DBF_TEXT_(TRACE, 3, "%s", CARD_BUS_ID(card));
  531. QETH_DBF_HEX(TRACE, 3, addr->sa_data, OSA_ADDR_LEN);
  532. rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]);
  533. if (!rc)
  534. rc = qeth_l2_send_setmac(card, addr->sa_data);
  535. return rc;
  536. }
  537. static void qeth_l2_set_multicast_list(struct net_device *dev)
  538. {
  539. struct qeth_card *card = netdev_priv(dev);
  540. struct dev_mc_list *dm;
  541. if (card->info.type == QETH_CARD_TYPE_OSN)
  542. return ;
  543. QETH_DBF_TEXT(TRACE, 3, "setmulti");
  544. qeth_l2_del_all_mc(card);
  545. spin_lock_bh(&card->mclock);
  546. for (dm = dev->mc_list; dm; dm = dm->next)
  547. qeth_l2_add_mc(card, dm->dmi_addr);
  548. spin_unlock_bh(&card->mclock);
  549. if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
  550. return;
  551. qeth_setadp_promisc_mode(card);
  552. }
  553. static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
  554. {
  555. int rc;
  556. struct qeth_hdr *hdr = NULL;
  557. int elements = 0;
  558. struct qeth_card *card = netdev_priv(dev);
  559. struct sk_buff *new_skb = skb;
  560. int ipv = qeth_get_ip_version(skb);
  561. int cast_type = qeth_get_cast_type(card, skb);
  562. struct qeth_qdio_out_q *queue = card->qdio.out_qs
  563. [qeth_get_priority_queue(card, skb, ipv, cast_type)];
  564. int tx_bytes = skb->len;
  565. enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO;
  566. struct qeth_eddp_context *ctx = NULL;
  567. QETH_DBF_TEXT(TRACE, 6, "l2xmit");
  568. if ((card->state != CARD_STATE_UP) || !card->lan_online) {
  569. card->stats.tx_carrier_errors++;
  570. goto tx_drop;
  571. }
  572. if ((card->info.type == QETH_CARD_TYPE_OSN) &&
  573. (skb->protocol == htons(ETH_P_IPV6)))
  574. goto tx_drop;
  575. if (card->options.performance_stats) {
  576. card->perf_stats.outbound_cnt++;
  577. card->perf_stats.outbound_start_time = qeth_get_micros();
  578. }
  579. netif_stop_queue(dev);
  580. if (skb_is_gso(skb))
  581. large_send = QETH_LARGE_SEND_EDDP;
  582. if (card->info.type == QETH_CARD_TYPE_OSN)
  583. hdr = (struct qeth_hdr *)skb->data;
  584. else {
  585. new_skb = qeth_prepare_skb(card, skb, &hdr);
  586. if (!new_skb)
  587. goto tx_drop;
  588. qeth_l2_fill_header(card, hdr, new_skb, ipv, cast_type);
  589. }
  590. if (large_send == QETH_LARGE_SEND_EDDP) {
  591. ctx = qeth_eddp_create_context(card, new_skb, hdr,
  592. skb->sk->sk_protocol);
  593. if (ctx == NULL) {
  594. PRINT_WARN("could not create eddp context\n");
  595. goto tx_drop;
  596. }
  597. } else {
  598. elements = qeth_get_elements_no(card, (void *)hdr, new_skb, 0);
  599. if (!elements)
  600. goto tx_drop;
  601. }
  602. if ((large_send == QETH_LARGE_SEND_NO) &&
  603. (skb->ip_summed == CHECKSUM_PARTIAL))
  604. qeth_tx_csum(new_skb);
  605. if (card->info.type != QETH_CARD_TYPE_IQD)
  606. rc = qeth_do_send_packet(card, queue, new_skb, hdr,
  607. elements, ctx);
  608. else
  609. rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
  610. elements, ctx);
  611. if (!rc) {
  612. card->stats.tx_packets++;
  613. card->stats.tx_bytes += tx_bytes;
  614. if (new_skb != skb)
  615. dev_kfree_skb_any(skb);
  616. if (card->options.performance_stats) {
  617. if (large_send != QETH_LARGE_SEND_NO) {
  618. card->perf_stats.large_send_bytes += tx_bytes;
  619. card->perf_stats.large_send_cnt++;
  620. }
  621. if (skb_shinfo(new_skb)->nr_frags > 0) {
  622. card->perf_stats.sg_skbs_sent++;
  623. /* nr_frags + skb->data */
  624. card->perf_stats.sg_frags_sent +=
  625. skb_shinfo(new_skb)->nr_frags + 1;
  626. }
  627. }
  628. if (ctx != NULL) {
  629. qeth_eddp_put_context(ctx);
  630. dev_kfree_skb_any(new_skb);
  631. }
  632. } else {
  633. if (ctx != NULL)
  634. qeth_eddp_put_context(ctx);
  635. if (rc == -EBUSY) {
  636. if (new_skb != skb)
  637. dev_kfree_skb_any(new_skb);
  638. return NETDEV_TX_BUSY;
  639. } else
  640. goto tx_drop;
  641. }
  642. netif_wake_queue(dev);
  643. if (card->options.performance_stats)
  644. card->perf_stats.outbound_time += qeth_get_micros() -
  645. card->perf_stats.outbound_start_time;
  646. return rc;
  647. tx_drop:
  648. card->stats.tx_dropped++;
  649. card->stats.tx_errors++;
  650. if ((new_skb != skb) && new_skb)
  651. dev_kfree_skb_any(new_skb);
  652. dev_kfree_skb_any(skb);
  653. return NETDEV_TX_OK;
  654. }
  655. static void qeth_l2_qdio_input_handler(struct ccw_device *ccwdev,
  656. unsigned int status, unsigned int qdio_err,
  657. unsigned int siga_err, unsigned int queue,
  658. int first_element, int count, unsigned long card_ptr)
  659. {
  660. struct net_device *net_dev;
  661. struct qeth_card *card;
  662. struct qeth_qdio_buffer *buffer;
  663. int index;
  664. int i;
  665. QETH_DBF_TEXT(TRACE, 6, "qdinput");
  666. card = (struct qeth_card *) card_ptr;
  667. net_dev = card->dev;
  668. if (card->options.performance_stats) {
  669. card->perf_stats.inbound_cnt++;
  670. card->perf_stats.inbound_start_time = qeth_get_micros();
  671. }
  672. if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
  673. if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION) {
  674. QETH_DBF_TEXT(TRACE, 1, "qdinchk");
  675. QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card));
  676. QETH_DBF_TEXT_(TRACE, 1, "%04X%04X", first_element,
  677. count);
  678. QETH_DBF_TEXT_(TRACE, 1, "%04X%04X", queue, status);
  679. qeth_schedule_recovery(card);
  680. return;
  681. }
  682. }
  683. for (i = first_element; i < (first_element + count); ++i) {
  684. index = i % QDIO_MAX_BUFFERS_PER_Q;
  685. buffer = &card->qdio.in_q->bufs[index];
  686. if (!((status & QDIO_STATUS_LOOK_FOR_ERROR) &&
  687. qeth_check_qdio_errors(buffer->buffer,
  688. qdio_err, siga_err, "qinerr")))
  689. qeth_l2_process_inbound_buffer(card, buffer, index);
  690. /* clear buffer and give back to hardware */
  691. qeth_put_buffer_pool_entry(card, buffer->pool_entry);
  692. qeth_queue_input_buffer(card, index);
  693. }
  694. if (card->options.performance_stats)
  695. card->perf_stats.inbound_time += qeth_get_micros() -
  696. card->perf_stats.inbound_start_time;
  697. }
  698. static int qeth_l2_open(struct net_device *dev)
  699. {
  700. struct qeth_card *card = netdev_priv(dev);
  701. QETH_DBF_TEXT(TRACE, 4, "qethopen");
  702. if (card->state != CARD_STATE_SOFTSETUP)
  703. return -ENODEV;
  704. if ((card->info.type != QETH_CARD_TYPE_OSN) &&
  705. (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) {
  706. QETH_DBF_TEXT(TRACE, 4, "nomacadr");
  707. return -EPERM;
  708. }
  709. card->data.state = CH_STATE_UP;
  710. card->state = CARD_STATE_UP;
  711. card->dev->flags |= IFF_UP;
  712. netif_start_queue(dev);
  713. if (!card->lan_online && netif_carrier_ok(dev))
  714. netif_carrier_off(dev);
  715. return 0;
  716. }
  717. static int qeth_l2_stop(struct net_device *dev)
  718. {
  719. struct qeth_card *card = netdev_priv(dev);
  720. QETH_DBF_TEXT(TRACE, 4, "qethstop");
  721. netif_tx_disable(dev);
  722. card->dev->flags &= ~IFF_UP;
  723. if (card->state == CARD_STATE_UP)
  724. card->state = CARD_STATE_SOFTSETUP;
  725. return 0;
  726. }
  727. static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
  728. {
  729. struct qeth_card *card = dev_get_drvdata(&gdev->dev);
  730. INIT_LIST_HEAD(&card->vid_list);
  731. INIT_LIST_HEAD(&card->mc_list);
  732. card->options.layer2 = 1;
  733. card->discipline.input_handler = (qdio_handler_t *)
  734. qeth_l2_qdio_input_handler;
  735. card->discipline.output_handler = (qdio_handler_t *)
  736. qeth_qdio_output_handler;
  737. card->discipline.recover = qeth_l2_recover;
  738. return 0;
  739. }
  740. static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
  741. {
  742. struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
  743. wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
  744. if (cgdev->state == CCWGROUP_ONLINE) {
  745. card->use_hard_stop = 1;
  746. qeth_l2_set_offline(cgdev);
  747. }
  748. if (card->dev) {
  749. unregister_netdev(card->dev);
  750. card->dev = NULL;
  751. }
  752. qeth_l2_del_all_mc(card);
  753. return;
  754. }
  755. static struct ethtool_ops qeth_l2_ethtool_ops = {
  756. .get_link = ethtool_op_get_link,
  757. .get_tx_csum = ethtool_op_get_tx_csum,
  758. .set_tx_csum = ethtool_op_set_tx_hw_csum,
  759. .get_sg = ethtool_op_get_sg,
  760. .set_sg = ethtool_op_set_sg,
  761. .get_tso = ethtool_op_get_tso,
  762. .set_tso = ethtool_op_set_tso,
  763. .get_strings = qeth_core_get_strings,
  764. .get_ethtool_stats = qeth_core_get_ethtool_stats,
  765. .get_stats_count = qeth_core_get_stats_count,
  766. .get_drvinfo = qeth_core_get_drvinfo,
  767. };
  768. static struct ethtool_ops qeth_l2_osn_ops = {
  769. .get_strings = qeth_core_get_strings,
  770. .get_ethtool_stats = qeth_core_get_ethtool_stats,
  771. .get_stats_count = qeth_core_get_stats_count,
  772. .get_drvinfo = qeth_core_get_drvinfo,
  773. };
  774. static int qeth_l2_setup_netdev(struct qeth_card *card)
  775. {
  776. switch (card->info.type) {
  777. case QETH_CARD_TYPE_OSAE:
  778. card->dev = alloc_etherdev(0);
  779. break;
  780. case QETH_CARD_TYPE_IQD:
  781. card->dev = alloc_netdev(0, "hsi%d", ether_setup);
  782. break;
  783. case QETH_CARD_TYPE_OSN:
  784. card->dev = alloc_netdev(0, "osn%d", ether_setup);
  785. card->dev->flags |= IFF_NOARP;
  786. break;
  787. default:
  788. card->dev = alloc_etherdev(0);
  789. }
  790. if (!card->dev)
  791. return -ENODEV;
  792. card->dev->priv = card;
  793. card->dev->tx_timeout = &qeth_tx_timeout;
  794. card->dev->watchdog_timeo = QETH_TX_TIMEOUT;
  795. card->dev->open = qeth_l2_open;
  796. card->dev->stop = qeth_l2_stop;
  797. card->dev->hard_start_xmit = qeth_l2_hard_start_xmit;
  798. card->dev->do_ioctl = qeth_l2_do_ioctl;
  799. card->dev->get_stats = qeth_get_stats;
  800. card->dev->change_mtu = qeth_change_mtu;
  801. card->dev->set_multicast_list = qeth_l2_set_multicast_list;
  802. card->dev->vlan_rx_kill_vid = qeth_l2_vlan_rx_kill_vid;
  803. card->dev->vlan_rx_add_vid = qeth_l2_vlan_rx_add_vid;
  804. card->dev->set_mac_address = qeth_l2_set_mac_address;
  805. card->dev->mtu = card->info.initial_mtu;
  806. if (card->info.type != QETH_CARD_TYPE_OSN)
  807. SET_ETHTOOL_OPS(card->dev, &qeth_l2_ethtool_ops);
  808. else
  809. SET_ETHTOOL_OPS(card->dev, &qeth_l2_osn_ops);
  810. card->dev->features |= NETIF_F_HW_VLAN_FILTER;
  811. card->info.broadcast_capable = 1;
  812. qeth_l2_request_initial_mac(card);
  813. SET_NETDEV_DEV(card->dev, &card->gdev->dev);
  814. return register_netdev(card->dev);
  815. }
  816. static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
  817. {
  818. struct qeth_card *card = dev_get_drvdata(&gdev->dev);
  819. int rc = 0;
  820. enum qeth_card_states recover_flag;
  821. BUG_ON(!card);
  822. QETH_DBF_TEXT(SETUP, 2, "setonlin");
  823. QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
  824. qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1);
  825. if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)) {
  826. PRINT_WARN("set_online of card %s interrupted by user!\n",
  827. CARD_BUS_ID(card));
  828. return -ERESTARTSYS;
  829. }
  830. recover_flag = card->state;
  831. rc = ccw_device_set_online(CARD_RDEV(card));
  832. if (rc) {
  833. QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
  834. return -EIO;
  835. }
  836. rc = ccw_device_set_online(CARD_WDEV(card));
  837. if (rc) {
  838. QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
  839. return -EIO;
  840. }
  841. rc = ccw_device_set_online(CARD_DDEV(card));
  842. if (rc) {
  843. QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
  844. return -EIO;
  845. }
  846. rc = qeth_core_hardsetup_card(card);
  847. if (rc) {
  848. QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc);
  849. goto out_remove;
  850. }
  851. if (!card->dev && qeth_l2_setup_netdev(card))
  852. goto out_remove;
  853. if (card->info.type != QETH_CARD_TYPE_OSN)
  854. qeth_l2_send_setmac(card, &card->dev->dev_addr[0]);
  855. card->state = CARD_STATE_HARDSETUP;
  856. qeth_print_status_message(card);
  857. /* softsetup */
  858. QETH_DBF_TEXT(SETUP, 2, "softsetp");
  859. rc = qeth_send_startlan(card);
  860. if (rc) {
  861. QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
  862. if (rc == 0xe080) {
  863. PRINT_WARN("LAN on card %s if offline! "
  864. "Waiting for STARTLAN from card.\n",
  865. CARD_BUS_ID(card));
  866. card->lan_online = 0;
  867. }
  868. return rc;
  869. } else
  870. card->lan_online = 1;
  871. if (card->info.type != QETH_CARD_TYPE_OSN) {
  872. qeth_set_large_send(card, card->options.large_send);
  873. qeth_l2_process_vlans(card, 0);
  874. }
  875. netif_tx_disable(card->dev);
  876. rc = qeth_init_qdio_queues(card);
  877. if (rc) {
  878. QETH_DBF_TEXT_(SETUP, 2, "6err%d", rc);
  879. goto out_remove;
  880. }
  881. card->state = CARD_STATE_SOFTSETUP;
  882. netif_carrier_on(card->dev);
  883. qeth_set_allowed_threads(card, 0xffffffff, 0);
  884. if (recover_flag == CARD_STATE_RECOVER) {
  885. if (recovery_mode &&
  886. card->info.type != QETH_CARD_TYPE_OSN) {
  887. qeth_l2_open(card->dev);
  888. } else {
  889. rtnl_lock();
  890. dev_open(card->dev);
  891. rtnl_unlock();
  892. }
  893. /* this also sets saved unicast addresses */
  894. qeth_l2_set_multicast_list(card->dev);
  895. }
  896. /* let user_space know that device is online */
  897. kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);
  898. return 0;
  899. out_remove:
  900. card->use_hard_stop = 1;
  901. qeth_l2_stop_card(card, 0);
  902. ccw_device_set_offline(CARD_DDEV(card));
  903. ccw_device_set_offline(CARD_WDEV(card));
  904. ccw_device_set_offline(CARD_RDEV(card));
  905. if (recover_flag == CARD_STATE_RECOVER)
  906. card->state = CARD_STATE_RECOVER;
  907. else
  908. card->state = CARD_STATE_DOWN;
  909. return -ENODEV;
  910. }
  911. static int qeth_l2_set_online(struct ccwgroup_device *gdev)
  912. {
  913. return __qeth_l2_set_online(gdev, 0);
  914. }
  915. static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
  916. int recovery_mode)
  917. {
  918. struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
  919. int rc = 0, rc2 = 0, rc3 = 0;
  920. enum qeth_card_states recover_flag;
  921. QETH_DBF_TEXT(SETUP, 3, "setoffl");
  922. QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *));
  923. if (card->dev && netif_carrier_ok(card->dev))
  924. netif_carrier_off(card->dev);
  925. recover_flag = card->state;
  926. if (qeth_l2_stop_card(card, recovery_mode) == -ERESTARTSYS) {
  927. PRINT_WARN("Stopping card %s interrupted by user!\n",
  928. CARD_BUS_ID(card));
  929. return -ERESTARTSYS;
  930. }
  931. rc = ccw_device_set_offline(CARD_DDEV(card));
  932. rc2 = ccw_device_set_offline(CARD_WDEV(card));
  933. rc3 = ccw_device_set_offline(CARD_RDEV(card));
  934. if (!rc)
  935. rc = (rc2) ? rc2 : rc3;
  936. if (rc)
  937. QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
  938. if (recover_flag == CARD_STATE_UP)
  939. card->state = CARD_STATE_RECOVER;
  940. /* let user_space know that device is offline */
  941. kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE);
  942. return 0;
  943. }
  944. static int qeth_l2_set_offline(struct ccwgroup_device *cgdev)
  945. {
  946. return __qeth_l2_set_offline(cgdev, 0);
  947. }
  948. static int qeth_l2_recover(void *ptr)
  949. {
  950. struct qeth_card *card;
  951. int rc = 0;
  952. card = (struct qeth_card *) ptr;
  953. QETH_DBF_TEXT(TRACE, 2, "recover1");
  954. QETH_DBF_HEX(TRACE, 2, &card, sizeof(void *));
  955. if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
  956. return 0;
  957. QETH_DBF_TEXT(TRACE, 2, "recover2");
  958. PRINT_WARN("Recovery of device %s started ...\n",
  959. CARD_BUS_ID(card));
  960. card->use_hard_stop = 1;
  961. __qeth_l2_set_offline(card->gdev, 1);
  962. rc = __qeth_l2_set_online(card->gdev, 1);
  963. /* don't run another scheduled recovery */
  964. qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
  965. qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
  966. if (!rc)
  967. PRINT_INFO("Device %s successfully recovered!\n",
  968. CARD_BUS_ID(card));
  969. else
  970. PRINT_INFO("Device %s could not be recovered!\n",
  971. CARD_BUS_ID(card));
  972. return 0;
  973. }
  974. static int __init qeth_l2_init(void)
  975. {
  976. PRINT_INFO("register layer 2 discipline\n");
  977. return 0;
  978. }
  979. static void __exit qeth_l2_exit(void)
  980. {
  981. PRINT_INFO("unregister layer 2 discipline\n");
  982. }
  983. static void qeth_l2_shutdown(struct ccwgroup_device *gdev)
  984. {
  985. struct qeth_card *card = dev_get_drvdata(&gdev->dev);
  986. qeth_qdio_clear_card(card, 0);
  987. qeth_clear_qdio_buffers(card);
  988. }
  989. struct ccwgroup_driver qeth_l2_ccwgroup_driver = {
  990. .probe = qeth_l2_probe_device,
  991. .remove = qeth_l2_remove_device,
  992. .set_online = qeth_l2_set_online,
  993. .set_offline = qeth_l2_set_offline,
  994. .shutdown = qeth_l2_shutdown,
  995. };
  996. EXPORT_SYMBOL_GPL(qeth_l2_ccwgroup_driver);
  997. static int qeth_osn_send_control_data(struct qeth_card *card, int len,
  998. struct qeth_cmd_buffer *iob)
  999. {
  1000. unsigned long flags;
  1001. int rc = 0;
  1002. QETH_DBF_TEXT(TRACE, 5, "osndctrd");
  1003. wait_event(card->wait_q,
  1004. atomic_cmpxchg(&card->write.irq_pending, 0, 1) == 0);
  1005. qeth_prepare_control_data(card, len, iob);
  1006. QETH_DBF_TEXT(TRACE, 6, "osnoirqp");
  1007. spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
  1008. rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
  1009. (addr_t) iob, 0, 0);
  1010. spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
  1011. if (rc) {
  1012. PRINT_WARN("qeth_osn_send_control_data: "
  1013. "ccw_device_start rc = %i\n", rc);
  1014. QETH_DBF_TEXT_(TRACE, 2, " err%d", rc);
  1015. qeth_release_buffer(iob->channel, iob);
  1016. atomic_set(&card->write.irq_pending, 0);
  1017. wake_up(&card->wait_q);
  1018. }
  1019. return rc;
  1020. }
  1021. static int qeth_osn_send_ipa_cmd(struct qeth_card *card,
  1022. struct qeth_cmd_buffer *iob, int data_len)
  1023. {
  1024. u16 s1, s2;
  1025. QETH_DBF_TEXT(TRACE, 4, "osndipa");
  1026. qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
  1027. s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
  1028. s2 = (u16)data_len;
  1029. memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
  1030. memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
  1031. memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
  1032. memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
  1033. return qeth_osn_send_control_data(card, s1, iob);
  1034. }
  1035. int qeth_osn_assist(struct net_device *dev, void *data, int data_len)
  1036. {
  1037. struct qeth_cmd_buffer *iob;
  1038. struct qeth_card *card;
  1039. int rc;
  1040. QETH_DBF_TEXT(TRACE, 2, "osnsdmc");
  1041. if (!dev)
  1042. return -ENODEV;
  1043. card = netdev_priv(dev);
  1044. if (!card)
  1045. return -ENODEV;
  1046. if ((card->state != CARD_STATE_UP) &&
  1047. (card->state != CARD_STATE_SOFTSETUP))
  1048. return -ENODEV;
  1049. iob = qeth_wait_for_buffer(&card->write);
  1050. memcpy(iob->data+IPA_PDU_HEADER_SIZE, data, data_len);
  1051. rc = qeth_osn_send_ipa_cmd(card, iob, data_len);
  1052. return rc;
  1053. }
  1054. EXPORT_SYMBOL(qeth_osn_assist);
  1055. int qeth_osn_register(unsigned char *read_dev_no, struct net_device **dev,
  1056. int (*assist_cb)(struct net_device *, void *),
  1057. int (*data_cb)(struct sk_buff *))
  1058. {
  1059. struct qeth_card *card;
  1060. QETH_DBF_TEXT(TRACE, 2, "osnreg");
  1061. *dev = qeth_l2_netdev_by_devno(read_dev_no);
  1062. if (*dev == NULL)
  1063. return -ENODEV;
  1064. card = netdev_priv(*dev);
  1065. if (!card)
  1066. return -ENODEV;
  1067. if ((assist_cb == NULL) || (data_cb == NULL))
  1068. return -EINVAL;
  1069. card->osn_info.assist_cb = assist_cb;
  1070. card->osn_info.data_cb = data_cb;
  1071. return 0;
  1072. }
  1073. EXPORT_SYMBOL(qeth_osn_register);
  1074. void qeth_osn_deregister(struct net_device *dev)
  1075. {
  1076. struct qeth_card *card;
  1077. QETH_DBF_TEXT(TRACE, 2, "osndereg");
  1078. if (!dev)
  1079. return;
  1080. card = netdev_priv(dev);
  1081. if (!card)
  1082. return;
  1083. card->osn_info.assist_cb = NULL;
  1084. card->osn_info.data_cb = NULL;
  1085. return;
  1086. }
  1087. EXPORT_SYMBOL(qeth_osn_deregister);
  1088. module_init(qeth_l2_init);
  1089. module_exit(qeth_l2_exit);
  1090. MODULE_AUTHOR("Frank Blaschka <frank.blaschka@de.ibm.com>");
  1091. MODULE_DESCRIPTION("qeth layer 2 discipline");
  1092. MODULE_LICENSE("GPL");