# HG changeset patch # User Uri Shkolnik <uris@xxxxxxxxxxxx> # Date 1232021993 -7200 # Node ID 101e8cca3fad7a2f0fbc8249135bd35f5ca85b0e # Parent d1b03bfce9d6d68ce586d7be33a41482f1b6cec7 Add big endian support From: Uri Shkolnik <uris@xxxxxxxxxxxx> Add big endian support Priority: normal Signed-off-by: Uri Shkolnik <uris@xxxxxxxxxxxx> diff -r d1b03bfce9d6 -r 101e8cca3fad linux/drivers/media/dvb/siano/Makefile --- a/linux/drivers/media/dvb/siano/Makefile Thu Jan 15 13:55:21 2009 +0200 +++ b/linux/drivers/media/dvb/siano/Makefile Thu Jan 15 14:19:53 2009 +0200 @@ -31,7 +31,7 @@ SMS_SPI_PXA310_DRV := 0 # Default object, include in every build variant -SMSOBJ := smscoreapi.o sms-cards.o +SMSOBJ := smscoreapi.o sms-cards.o smsendian.o EXTRA_CFLAGS += $(extra-cflags-y) $(extra-cflags-m) diff -r d1b03bfce9d6 -r 101e8cca3fad linux/drivers/media/dvb/siano/smscoreapi.c --- a/linux/drivers/media/dvb/siano/smscoreapi.c Thu Jan 15 13:55:21 2009 +0200 +++ b/linux/drivers/media/dvb/siano/smscoreapi.c Thu Jan 15 14:19:53 2009 +0200 @@ -29,8 +29,10 @@ #include <linux/uaccess.h> #include <linux/firmware.h> +#include <asm/byteorder.h> #include "smscoreapi.h" +#include "smsendian.h" #include "sms-cards.h" #define MAX_GPIO_PIN_NUMBER 31 @@ -475,9 +477,14 @@ static int smscore_load_firmware_family2 void *buffer, size_t size) { struct SmsFirmware_ST *firmware = (struct SmsFirmware_ST *) buffer; struct SmsMsgHdr_ST *msg; - u32 mem_address = firmware->StartAddress; + u32 mem_address; u8 *payload = firmware->Payload; int rc = 0; + + firmware->StartAddress = __le32_to_cpu(firmware->StartAddress); + firmware->Length = __le32_to_cpu(firmware->Length); + + mem_address = firmware->StartAddress; sms_info("loading FW to addr 0x%x size %d", mem_address, firmware->Length); @@ -496,6 +503,7 @@ static int smscore_load_firmware_family2 sms_debug("sending reload command."); SMS_INIT_MSG(msg, MSG_SW_RELOAD_START_REQ, sizeof(struct SmsMsgHdr_ST)); + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)msg); rc = smscore_sendrequest_and_wait(coredev, msg, msg->msgLength, &coredev->reload_start_done); mem_address = *(u32 *) &payload[20]; @@ -513,6 +521,7 @@ static int smscore_load_firmware_family2 DataMsg->MemAddr = mem_address; memcpy(DataMsg->Payload, payload, payload_size); + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)msg); if ((coredev->device_flags & SMS_ROM_NO_RESPONSE) && (coredev->mode == DEVICE_MODE_NONE)) rc = coredev->sendrequest_handler(coredev->context, @@ -544,6 +553,7 @@ DataMsg, TriggerMsg->msgData[3] = 0; /* Parameter */ TriggerMsg->msgData[4] = 4; /* Task ID */ + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)msg); if (coredev->device_flags & SMS_ROM_NO_RESPONSE) { rc = coredev->sendrequest_handler(coredev-> context, TriggerMsg, @@ -557,7 +567,7 @@ DataMsg, } else { SMS_INIT_MSG(msg, MSG_SW_RELOAD_EXEC_REQ, sizeof(struct SmsMsgHdr_ST)); - + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)msg); rc = coredev->sendrequest_handler(coredev->context, msg, msg->msgLength); } @@ -706,6 +716,7 @@ static int smscore_detect_mode(struct sm SMS_INIT_MSG(msg, MSG_SMS_GET_VERSION_EX_REQ, sizeof(struct SmsMsgHdr_ST)); + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)msg); rc = smscore_sendrequest_and_wait(coredev, msg, msg->msgLength, &coredev->version_ex_done); if (rc == -ETIME) { @@ -829,6 +840,7 @@ int smscore_set_device_mode(struct smsco sizeof(struct SmsMsgData_ST)); msg->msgData[0] = mode; + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)msg); rc = smscore_sendrequest_and_wait(coredev, msg, msg->xMsgHeader. msgLength, &coredev->init_device_done); @@ -1021,13 +1033,11 @@ void smscore_onresponse(struct smscore_d data_total += cb->size; /* If no client registered for type & id, * check for control client where type is not registered */ - sms_debug("phdr->msgType = %d t size = %d", phdr->msgType, data_total); - if (client) rc = client->onresponse_handler(client->context, cb); if (rc < 0) { - sms_debug("rc < 0"); + smsendian_handle_rx_message((struct SmsMsgData_ST *)phdr); switch (phdr->msgType) { case MSG_SMS_GET_VERSION_EX_RES: { @@ -1205,8 +1215,8 @@ int smscore_register_client(struct smsco smscore_validate_client(coredev, newclient, params->data_type, params->initial_id); *client = newclient; - sms_debug("%p %d %d", params->context, params->data_type, - params->initial_id); + sms_debug("Register new client %p DT=%d ID=%d", + params->context, params->data_type, params->initial_id); return 0; } @@ -1441,6 +1451,7 @@ int smscore_gpio_configure(struct smscor pMsg->msgData[5] = 0; } + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)pMsg); rc = smscore_sendrequest_and_wait(coredev, pMsg, totalLen, &coredev->gpio_configuration_done); @@ -1489,7 +1500,8 @@ int smscore_gpio_set_level(struct smscor pMsg->msgData[0] = PinNum; pMsg->msgData[1] = NewLevel; - /* Sent message to SMS */ + /* Send message to SMS */ + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)pMsg); rc = smscore_sendrequest_and_wait(coredev, pMsg, totalLen, &coredev->gpio_set_level_done); @@ -1537,7 +1549,8 @@ int smscore_gpio_get_level(struct smscor pMsg->msgData[0] = PinNum; pMsg->msgData[1] = 0; - /* Sent message to SMS */ + /* Send message to SMS */ + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)pMsg); rc = smscore_sendrequest_and_wait(coredev, pMsg, totalLen, &coredev->gpio_get_level_done); diff -r d1b03bfce9d6 -r 101e8cca3fad linux/drivers/media/dvb/siano/smsdvb.c --- a/linux/drivers/media/dvb/siano/smsdvb.c Thu Jan 15 13:55:21 2009 +0200 +++ b/linux/drivers/media/dvb/siano/smsdvb.c Thu Jan 15 14:19:53 2009 +0200 @@ -21,8 +21,10 @@ along with this program. If not, see <h #include <linux/module.h> #include <linux/init.h> +#include <asm/byteorder.h> #include "smscoreapi.h" +#include "smsendian.h" #include "sms-cards.h" DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); @@ -75,6 +77,8 @@ static int smsdvb_onresponse(void *conte struct smsdvb_client_t *client = (struct smsdvb_client_t *)context; struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *)(((u8 *) cb->p) + cb->offset); + + smsendian_handle_rx_message((struct SmsMsgData_ST *)phdr); switch (phdr->msgType) { case MSG_SMS_DVBT_BDA_DATA: @@ -163,6 +167,7 @@ static int smsdvb_start_feed(struct dvb_ PidMsg.xMsgHeader.msgLength = sizeof(PidMsg); PidMsg.msgData[0] = feed->pid; + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)&PidMsg); return smsclient_sendrequest(client->smsclient, &PidMsg, sizeof(PidMsg)); } @@ -182,6 +187,7 @@ static int smsdvb_stop_feed(struct dvb_d PidMsg.xMsgHeader.msgLength = sizeof(PidMsg); PidMsg.msgData[0] = feed->pid; + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)&PidMsg); return smsclient_sendrequest(client->smsclient, &PidMsg, sizeof(PidMsg)); } @@ -190,7 +196,10 @@ static int smsdvb_sendrequest_and_wait(s void *buffer, size_t size, struct completion *completion) { - int rc = smsclient_sendrequest(client->smsclient, buffer, size); + int rc; + + smsendian_handle_tx_message((struct SmsMsgHdr_ST *)buffer); + rc = smsclient_sendrequest(client->smsclient, buffer, size); if (rc < 0) return rc; diff -r d1b03bfce9d6 -r 101e8cca3fad linux/drivers/media/dvb/siano/smsendian.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linux/drivers/media/dvb/siano/smsendian.c Thu Jan 15 14:19:53 2009 +0200 @@ -0,0 +1,100 @@ +/**************************************************************** + + Siano Mobile Silicon, Inc. + MDTV receiver kernel modules. + Copyright (C) 2006-2009, Uri Shkolnik + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + ****************************************************************/ + +#include <asm/byteorder.h> + +#include "smsendian.h" +#include "smscoreapi.h" + +void smsendian_handle_tx_message(void *buffer) +{ +#ifdef __BIG_ENDIAN + struct SmsMsgData_ST *msg = (struct SmsMsgData_ST *)buffer; + int i; + int msgWords; + + switch (msg->xMsgHeader.msgType) { + case MSG_SMS_DATA_DOWNLOAD_REQ: + { + msg->msgData[0] = __le32_to_cpu(msg->msgData[0]); + break; + } + + default: + msgWords = (msg->xMsgHeader.msgLength - + sizeof(struct SmsMsgHdr_ST))/4; + + for (i = 0; i < msgWords; i++) + msg->msgData[i] = __le32_to_cpu(msg->msgData[i]); + + break; + } +#endif /* __BIG_ENDIAN */ +} + +void smsendian_handle_rx_message(void *buffer) +{ +#ifdef __BIG_ENDIAN + struct SmsMsgData_ST *msg = (struct SmsMsgData_ST *)buffer; + int i; + int msgWords; + + switch (msg->xMsgHeader.msgType) { + case MSG_SMS_GET_VERSION_EX_RES: + { + struct SmsVersionRes_ST *ver = + (struct SmsVersionRes_ST *) msg; + ver->ChipModel = __le16_to_cpu(ver->ChipModel); + break; + } + + case MSG_SMS_DVBT_BDA_DATA: + case MSG_SMS_DAB_CHANNEL: + case MSG_SMS_DATA_MSG: + { + break; + } + + default: + { + msgWords = (msg->xMsgHeader.msgLength - + sizeof(struct SmsMsgHdr_ST))/4; + + for (i = 0; i < msgWords; i++) + msg->msgData[i] = __le32_to_cpu(msg->msgData[i]); + + break; + } + } +#endif /* __BIG_ENDIAN */ +} + +void smsendian_handle_message_header(void *msg) +{ +#ifdef __BIG_ENDIAN + struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *)msg; + + phdr->msgType = __le16_to_cpu(phdr->msgType); + phdr->msgLength = __le16_to_cpu(phdr->msgLength); + phdr->msgFlags = __le16_to_cpu(phdr->msgFlags); +#endif /* __BIG_ENDIAN */ +} + diff -r d1b03bfce9d6 -r 101e8cca3fad linux/drivers/media/dvb/siano/smsendian.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linux/drivers/media/dvb/siano/smsendian.h Thu Jan 15 14:19:53 2009 +0200 @@ -0,0 +1,32 @@ +/**************************************************************** + +Siano Mobile Silicon, Inc. +MDTV receiver kernel modules. +Copyright (C) 2006-2009, Uri Shkolnik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + + This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. + +****************************************************************/ + +#ifndef __SMS_ENDIAN_H__ +#define __SMS_ENDIAN_H__ + +#include <asm/byteorder.h> + +void smsendian_handle_tx_message(void *buffer); +void smsendian_handle_rx_message(void *buffer); +void smsendian_handle_message_header(void *msg); + +#endif /* __SMS_ENDIAN_H__ */ + diff -r d1b03bfce9d6 -r 101e8cca3fad linux/drivers/media/dvb/siano/smsusb.c --- a/linux/drivers/media/dvb/siano/smsusb.c Thu Jan 15 13:55:21 2009 +0200 +++ b/linux/drivers/media/dvb/siano/smsusb.c Thu Jan 15 14:19:53 2009 +0200 @@ -23,9 +23,11 @@ along with this program. If not, see <h #include <linux/init.h> #include <linux/usb.h> #include <linux/firmware.h> +#include <asm/byteorder.h> #include "smscoreapi.h" #include "sms-cards.h" +#include "smsendian.h" #define USB1_BUFFER_SIZE 0x1000 #define USB2_BUFFER_SIZE 0x4000 @@ -73,6 +75,7 @@ static void smsusb_onresponse(struct urb if (urb->actual_length > 0) { struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *)surb->cb->p; + smsendian_handle_message_header(phdr); if (urb->actual_length >= phdr->msgLength) { surb->cb->size = phdr->msgLength; @@ -172,6 +175,7 @@ static int smsusb_sendrequest(void *cont struct smsusb_device_t *dev = (struct smsusb_device_t *)context; int dummy; + smsendian_handle_message_header((struct SmsMsgHdr_ST *)buffer); return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2), buffer, size, &dummy, 1000); } @@ -330,7 +334,7 @@ static int smsusb_init_device(struct usb case SMS_VEGA: dev->buffer_size = USB2_BUFFER_SIZE; dev->response_alignment = - dev->udev->ep_in[1]->desc.wMaxPacketSize - + __le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) - sizeof(struct SmsMsgHdr_ST); params.flags |= SMS_DEVICE_FAMILY2; -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html