mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #6167 from hug-dev/cm3ds-bug-fix
CM3DS Maintenance Pull Request: Bug fixes (1/4)pull/6102/head
commit
21483cd59d
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2017 ARM Limited
|
/* Copyright (c) 2017-2018 ARM Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -22,12 +22,22 @@
|
||||||
/* size is 1522 bytes to accommodate the four-byte VLAN tag. */
|
/* size is 1522 bytes to accommodate the four-byte VLAN tag. */
|
||||||
#define ETH_MAX_FLEN 1522u /* recommended size for a VLAN frame */
|
#define ETH_MAX_FLEN 1522u /* recommended size for a VLAN frame */
|
||||||
|
|
||||||
/* Maximum Transfer Unit
|
/*
|
||||||
|
* Maximum Transfer Unit
|
||||||
* The IEEE 802.3 specification limits the data portion of the 802.3 frame
|
* The IEEE 802.3 specification limits the data portion of the 802.3 frame
|
||||||
* to a minimum of 46 and a maximum of 1500 bytes, this is on L3 level.
|
* to a minimum of 46 and a maximum of 1522 bytes, this is on L2 level.
|
||||||
*/
|
*/
|
||||||
#define ETH_L2_HEADER_LEN 22u
|
#define ETH_L2_HEADER_LEN 22u
|
||||||
|
|
||||||
#define ETH_MAX_PAYLOAD_LEN (ETH_MAX_FLEN - ETH_L2_HEADER_LEN)
|
#define ETH_MAX_PAYLOAD_LEN (ETH_MAX_FLEN - ETH_L2_HEADER_LEN)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set this value to 2 to ensure that payload address of packet buffers is
|
||||||
|
* aligned on a 32 bits boundary.
|
||||||
|
* The padding is removed before passing the packet to the ethernet driver,
|
||||||
|
* hence defining this value to 2 will not prevent alignment issues inside the
|
||||||
|
* ethernet driver.
|
||||||
|
*/
|
||||||
|
#define ETH_PAD_SIZE 0
|
||||||
|
|
||||||
#endif /* LWIPOPTS_CONF_H */
|
#endif /* LWIPOPTS_CONF_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* mbed Microcontroller Library
|
/* mbed Microcontroller Library
|
||||||
* Copyright (c) 2017 ARM Limited
|
* Copyright (c) 2017-2018 ARM Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -316,16 +316,16 @@ err_t eth_arch_enetif_init(struct netif *netif)
|
||||||
err_t error = ERR_OK;
|
err_t error = ERR_OK;
|
||||||
struct ethernetif *ethernetif;
|
struct ethernetif *ethernetif;
|
||||||
|
|
||||||
ethernetif->is_enabled = 0;
|
|
||||||
|
|
||||||
LWIP_ASSERT("netif != NULL", (netif != NULL));
|
LWIP_ASSERT("netif != NULL", (netif != NULL));
|
||||||
|
|
||||||
ethernetif = mem_malloc(sizeof(struct ethernetif));
|
ethernetif = mem_malloc(sizeof(struct ethernetif));
|
||||||
|
|
||||||
if (ethernetif == NULL) {
|
if (ethernetif == NULL) {
|
||||||
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: out of memory\n"));
|
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: out of memory\n"));
|
||||||
return ERR_MEM;
|
return ERR_MEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ethernetif->is_enabled = 0;
|
||||||
|
|
||||||
#if LWIP_NETIF_HOSTNAME
|
#if LWIP_NETIF_HOSTNAME
|
||||||
/* Initialize interface hostname */
|
/* Initialize interface hostname */
|
||||||
netif->hostname = HOSTNAME_STRING;
|
netif->hostname = HOSTNAME_STRING;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* mbed Microcontroller Library
|
/* mbed Microcontroller Library
|
||||||
* Copyright (c) 2017 ARM Limited
|
* Copyright (c) 2017-2018 ARM Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -426,6 +426,53 @@ static int smsc9220_check_id(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Fill the SMSC9220 TX FIFO with a number of words at an aligned
|
||||||
|
* address.
|
||||||
|
*
|
||||||
|
* \param[in] data Pointer to the aligned data that should be sent.
|
||||||
|
* \param[in] dwords_to_write Number of data words to write.
|
||||||
|
*/
|
||||||
|
static void fill_tx_fifo_aligned(unsigned int *data,
|
||||||
|
unsigned int dwords_to_write)
|
||||||
|
{
|
||||||
|
while (dwords_to_write > 0) {
|
||||||
|
SMSC9220->TX_DATA_PORT = *data;
|
||||||
|
data++;
|
||||||
|
dwords_to_write--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Fill the SMSC9220 TX FIFO with a number of words at an unaligned
|
||||||
|
* address. This function ensures that loading words at that address will
|
||||||
|
* not generate unaligned access which can trigger an exception to the
|
||||||
|
* processor.
|
||||||
|
*
|
||||||
|
* \param[in] data Pointer to the unaligned data that should be sent.
|
||||||
|
* \param[in] dwords_to_write Number of data words to write.
|
||||||
|
*/
|
||||||
|
static void fill_tx_fifo_unaligned(uint8_t *data, unsigned int dwords_to_write)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Prevent unaligned word access from data pointer, 4 bytes are copied to
|
||||||
|
* this variable for each word that need to be sent.
|
||||||
|
*/
|
||||||
|
unsigned int tx_data_port_tmp = 0;
|
||||||
|
uint8_t *tx_data_port_tmp_ptr = (uint8_t *)&tx_data_port_tmp;
|
||||||
|
|
||||||
|
while (dwords_to_write > 0) {
|
||||||
|
/* Keep the same endianness in data than in the temp variable */
|
||||||
|
tx_data_port_tmp_ptr[0] = data[0];
|
||||||
|
tx_data_port_tmp_ptr[1] = data[1];
|
||||||
|
tx_data_port_tmp_ptr[2] = data[2];
|
||||||
|
tx_data_port_tmp_ptr[3] = data[3];
|
||||||
|
SMSC9220->TX_DATA_PORT = tx_data_port_tmp;
|
||||||
|
data += 4;
|
||||||
|
dwords_to_write--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
Public API
|
Public API
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
|
@ -574,7 +621,6 @@ int smsc9220_send_by_chunks(unsigned int total_packet_length, int is_new_packet,
|
||||||
int is_last_segment = 0; /* signing this is the last segment of the packet to be sent */
|
int is_last_segment = 0; /* signing this is the last segment of the packet to be sent */
|
||||||
unsigned int txcmd_a, txcmd_b = 0;
|
unsigned int txcmd_a, txcmd_b = 0;
|
||||||
unsigned int dwords_to_write = 0;
|
unsigned int dwords_to_write = 0;
|
||||||
unsigned int *pktptr = 0;
|
|
||||||
unsigned int xmit_inf = 0;
|
unsigned int xmit_inf = 0;
|
||||||
unsigned int tx_buffer_free_space = 0;
|
unsigned int tx_buffer_free_space = 0;
|
||||||
volatile unsigned int xmit_stat = 0;
|
volatile unsigned int xmit_stat = 0;
|
||||||
|
@ -602,7 +648,6 @@ int smsc9220_send_by_chunks(unsigned int total_packet_length, int is_new_packet,
|
||||||
is_last_segment = 1;
|
is_last_segment = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pktptr = (unsigned int *) data;
|
|
||||||
txcmd_a = 0;
|
txcmd_a = 0;
|
||||||
txcmd_b = 0;
|
txcmd_b = 0;
|
||||||
|
|
||||||
|
@ -616,11 +661,16 @@ int smsc9220_send_by_chunks(unsigned int total_packet_length, int is_new_packet,
|
||||||
SMSC9220->TX_DATA_PORT = txcmd_b;
|
SMSC9220->TX_DATA_PORT = txcmd_b;
|
||||||
dwords_to_write = (current_size + 3) >> 2;
|
dwords_to_write = (current_size + 3) >> 2;
|
||||||
|
|
||||||
/* PIO Copy to FIFO. Could replace this with DMA. */
|
/*
|
||||||
while(dwords_to_write > 0) {
|
* Copy to TX FIFO
|
||||||
SMSC9220->TX_DATA_PORT = *pktptr;
|
* The function to use depends on the alignment of the data pointer on a 32
|
||||||
pktptr++;
|
* bits boundary.
|
||||||
dwords_to_write--;
|
*/
|
||||||
|
if (((unsigned int)data % sizeof(uint32_t)) == 0) {
|
||||||
|
/* Cast is safe because we know data is aligned */
|
||||||
|
fill_tx_fifo_aligned((unsigned int *)data, dwords_to_write);
|
||||||
|
} else {
|
||||||
|
fill_tx_fifo_unaligned((uint8_t *)data, dwords_to_write);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_last_segment) {
|
if (is_last_segment) {
|
||||||
|
|
Loading…
Reference in New Issue