return 0;
}
+/**
+ * configures device features according to board configuration structure.
+ *
+ * @param coredev pointer to a coredev object returned by
+ * smscore_register_device
+ *
+ * @return 0 on success, <0 on error.
+ */
+int smscore_configure_board(struct smscore_device_t *coredev)
+{
+ struct sms_board *board;
+
+ board = sms_get_board(coredev->board_id);
+ if (!board) {
+ sms_err("no board configuration exist.");
+ return -EINVAL;
+ }
+
+ if (board->mtu) {
+ struct SmsMsgData_ST MtuMsg;
+ sms_debug("set max transmit unit %d", board->mtu);
+
+ MtuMsg.xMsgHeader.msgSrcId = 0;
+ MtuMsg.xMsgHeader.msgDstId = HIF_TASK;
+ MtuMsg.xMsgHeader.msgFlags = 0;
+ MtuMsg.xMsgHeader.msgType = MSG_SMS_SET_MAX_TX_MSG_LEN_REQ;
+ MtuMsg.xMsgHeader.msgLength = sizeof(MtuMsg);
+ MtuMsg.msgData[0] = board->mtu;
+
+ smsendian_handle_tx_message((struct SmsMsgHdr_ST *)&MtuMsg);
+ coredev->sendrequest_handler(coredev->context, &MtuMsg,
+ sizeof(MtuMsg));
+ }
+
+ if (board->crystal) {
+ struct SmsMsgData_ST CrysMsg;
+ sms_debug("set crystal value %d", board->crystal);
+
+ SMS_INIT_MSG(&CrysMsg.xMsgHeader,
+ MSG_SMS_NEW_CRYSTAL_REQ,
+ sizeof(CrysMsg));
+ CrysMsg.msgData[0] = board->crystal;
+
+ smsendian_handle_tx_message((struct SmsMsgHdr_S *)&CrysMsg);
+ coredev->sendrequest_handler(coredev->context, &CrysMsg,
+ sizeof(CrysMsg));
+ }
+
+ return 0;
+}
+
/**
* sets initial device mode and notifies client hotplugs that device is ready
*
sms_info("set device mode faile , rc %d", rc);
return rc;
}
+ rc = smscore_configure_board(coredev);
+ if (rc < 0) {
+ sms_info("configure board failed , rc %d", rc);
+ return rc;
+ }
kmutex_lock(&g_smscore_deviceslock);