+/**
+ * LGW initiated commands
+ */
+static int
+lcs_lgw_startlan_thread(void *data)
+{
+ struct lcs_card *card;
+
+ card = (struct lcs_card *) data;
+ daemonize("lgwstpln");
+
+ if (!lcs_do_run_thread(card, LCS_STARTLAN_THREAD))
+ return 0;
+ LCS_DBF_TEXT(4, trace, "lgwstpln");
+ if (card->dev)
+ netif_stop_queue(card->dev);
+ if (lcs_startlan(card) == 0) {
+ netif_wake_queue(card->dev);
+ card->state = DEV_STATE_UP;
+ PRINT_INFO("LCS Startlan for device %s succeeded!\n",
+ card->dev->name);
+
+ } else
+ PRINT_ERR("LCS Startlan for device %s failed!\n",
+ card->dev->name);
+ lcs_clear_thread_running_bit(card, LCS_STARTLAN_THREAD);
+ return 0;
+}
+
+/**
+ * Send startup command initiated by Lan Gateway
+ */
+static int
+lcs_lgw_startup_thread(void *data)
+{
+ int rc;
+
+ struct lcs_card *card;
+
+ card = (struct lcs_card *) data;
+ daemonize("lgwstaln");
+
+ if (!lcs_do_run_thread(card, LCS_STARTUP_THREAD))
+ return 0;
+ LCS_DBF_TEXT(4, trace, "lgwstaln");
+ if (card->dev)
+ netif_stop_queue(card->dev);
+ rc = lcs_send_startup(card, LCS_INITIATOR_LGW);
+ if (rc != 0) {
+ PRINT_ERR("Startup for LCS device %s initiated " \
+ "by LGW failed!\nReseting card ...\n",
+ card->dev->name);
+ /* do a card reset */
+ rc = lcs_resetcard(card);
+ if (rc == 0)
+ goto Done;
+ }
+ rc = lcs_startlan(card);
+ if (rc == 0) {
+ netif_wake_queue(card->dev);
+ card->state = DEV_STATE_UP;
+ }
+Done:
+ if (rc == 0)
+ PRINT_INFO("LCS Startup for device %s succeeded!\n",
+ card->dev->name);
+ else
+ PRINT_ERR("LCS Startup for device %s failed!\n",
+ card->dev->name);
+ lcs_clear_thread_running_bit(card, LCS_STARTUP_THREAD);
+ return 0;
+}
+
+
+/**
+ * send stoplan command initiated by Lan Gateway
+ */
+static int
+lcs_lgw_stoplan_thread(void *data)
+{
+ struct lcs_card *card;
+ int rc;
+
+ card = (struct lcs_card *) data;
+ daemonize("lgwstop");
+
+ if (!lcs_do_run_thread(card, LCS_STOPLAN_THREAD))
+ return 0;
+ LCS_DBF_TEXT(4, trace, "lgwstop");
+ if (card->dev)
+ netif_stop_queue(card->dev);
+ if (lcs_send_stoplan(card, LCS_INITIATOR_LGW) == 0)
+ PRINT_INFO("Stoplan for %s initiated by LGW succeeded!\n",
+ card->dev->name);
+ else
+ PRINT_ERR("Stoplan %s initiated by LGW failed!\n",
+ card->dev->name);
+ /*Try to reset the card, stop it on failure */
+ rc = lcs_resetcard(card);
+ if (rc != 0)
+ rc = lcs_stopcard(card);
+ lcs_clear_thread_running_bit(card, LCS_STOPLAN_THREAD);
+ return rc;
+}
+