mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Added preferred alignment to emac and copy to/from to memory manager
							parent
							
								
									4950a993fd
								
							
						
					
					
						commit
						5da3cd9cce
					
				| 
						 | 
				
			
			@ -63,6 +63,16 @@ void LWIPMemoryManager::copy(emac_mem_buf_t *to_buf, const emac_mem_buf_t *from_
 | 
			
		|||
    pbuf_copy(static_cast<struct pbuf *>(to_buf), static_cast<const struct pbuf *>(from_buf));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void LWIPMemoryManager::copy_to_buf(emac_mem_buf_t *to_buf, const void *ptr, uint32_t len)
 | 
			
		||||
{
 | 
			
		||||
    pbuf_take(static_cast<struct pbuf *>(to_buf), ptr, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t LWIPMemoryManager::copy_from_buf(void *ptr, uint32_t len, const emac_mem_buf_t *from_buf) const
 | 
			
		||||
{
 | 
			
		||||
    return pbuf_copy_partial(static_cast<const struct pbuf *>(from_buf), ptr, len, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void LWIPMemoryManager::cat(emac_mem_buf_t *to_buf, emac_mem_buf_t *cat_buf)
 | 
			
		||||
{
 | 
			
		||||
    pbuf_cat(static_cast<struct pbuf *>(to_buf), static_cast<struct pbuf *>(cat_buf));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,6 +86,31 @@ public:
 | 
			
		|||
     */
 | 
			
		||||
    virtual void copy(emac_mem_buf_t *to_buf, const emac_mem_buf_t *from_buf);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Copy to a memory buffer chain
 | 
			
		||||
     *
 | 
			
		||||
     * Copies data to a buffer chain. Copy operation does not adjust the lengths
 | 
			
		||||
     * of the copied-to memory buffer chain, so chain total length must match the
 | 
			
		||||
     * copied length.
 | 
			
		||||
     *
 | 
			
		||||
     * @param to_buf    Memory buffer chain to copy to
 | 
			
		||||
     * @param ptr       Pointer to data
 | 
			
		||||
     * @param len       Data length
 | 
			
		||||
     */
 | 
			
		||||
    virtual void copy_to_buf(emac_mem_buf_t *to_buf, const void *ptr, uint32_t len);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Copy from a memory buffer chain
 | 
			
		||||
     *
 | 
			
		||||
     * Copies data from a memory buffer chain.
 | 
			
		||||
     *
 | 
			
		||||
     * @param len       Data length
 | 
			
		||||
     * @param ptr       Pointer to data
 | 
			
		||||
     * @param from_buf  Memory buffer chain to copy from
 | 
			
		||||
     * @return          Length of the data that was copied
 | 
			
		||||
     */
 | 
			
		||||
    virtual uint32_t copy_from_buf(void *ptr, uint32_t len, const emac_mem_buf_t *from_buf) const;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Concatenate two memory buffer chains
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,6 +62,16 @@ public:
 | 
			
		|||
     */
 | 
			
		||||
    virtual uint32_t get_mtu_size() const = 0;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets memory buffer alignment preference
 | 
			
		||||
     *
 | 
			
		||||
     * Gets preferred memory buffer alignment of the Emac device. IP stack may or may not
 | 
			
		||||
     * align link out memory buffer chains using the alignment.
 | 
			
		||||
     *
 | 
			
		||||
     * @return         Memory alignment requirement in bytes
 | 
			
		||||
     */
 | 
			
		||||
    virtual uint32_t get_align_preference() const = 0;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return interface name
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
/* Copyright (c) 2018 ARM Limited
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "EMACMemoryManager.h"
 | 
			
		||||
 | 
			
		||||
void EMACMemoryManager::copy_to_buf(emac_mem_buf_t *to_buf, const void *ptr, uint32_t len)
 | 
			
		||||
{
 | 
			
		||||
    while (to_buf && len) {
 | 
			
		||||
        void *copy_to_ptr = get_ptr(to_buf);
 | 
			
		||||
        uint32_t copy_to_len = get_len(to_buf);
 | 
			
		||||
 | 
			
		||||
        if (copy_to_len > len) {
 | 
			
		||||
            copy_to_len = len;
 | 
			
		||||
            len = 0;
 | 
			
		||||
        } else {
 | 
			
		||||
            len -= copy_to_len;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        memcpy(copy_to_ptr, ptr, copy_to_len);
 | 
			
		||||
        ptr = static_cast<const uint8_t *>(ptr) + copy_to_len;
 | 
			
		||||
 | 
			
		||||
        to_buf = get_next(to_buf);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t EMACMemoryManager::copy_from_buf(void *ptr, uint32_t len, const emac_mem_buf_t *from_buf) const
 | 
			
		||||
{
 | 
			
		||||
    uint32_t copied_len = 0;
 | 
			
		||||
 | 
			
		||||
    while (from_buf && len) {
 | 
			
		||||
        void *copy_from_ptr = get_ptr(from_buf);
 | 
			
		||||
        uint32_t copy_from_len = get_len(from_buf);
 | 
			
		||||
 | 
			
		||||
        if (copy_from_len > len) {
 | 
			
		||||
            copy_from_len = len;
 | 
			
		||||
            len = 0;
 | 
			
		||||
        } else {
 | 
			
		||||
            len -= copy_from_len;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        memcpy(ptr, copy_from_ptr, copy_from_len);
 | 
			
		||||
        ptr = static_cast<uint8_t *>(ptr) + copy_from_len;
 | 
			
		||||
        copied_len += copy_from_len;
 | 
			
		||||
 | 
			
		||||
        from_buf = get_next(from_buf);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return copied_len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +36,8 @@
 | 
			
		|||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "nsapi.h"
 | 
			
		||||
 | 
			
		||||
typedef void emac_mem_buf_t;          // Memory buffer
 | 
			
		||||
 | 
			
		||||
class EMACMemoryManager {
 | 
			
		||||
| 
						 | 
				
			
			@ -106,6 +108,31 @@ public:
 | 
			
		|||
     */
 | 
			
		||||
    virtual void copy(emac_mem_buf_t *to_buf, const emac_mem_buf_t *from_buf) = 0;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Copy to a memory buffer chain
 | 
			
		||||
     *
 | 
			
		||||
     * Copies data to a buffer chain. Copy operation does not adjust the lengths
 | 
			
		||||
     * of the copied-to memory buffer chain, so chain total length must match the
 | 
			
		||||
     * copied length.
 | 
			
		||||
     *
 | 
			
		||||
     * @param to_buf    Memory buffer chain to copy to
 | 
			
		||||
     * @param ptr       Pointer to data
 | 
			
		||||
     * @param len       Data length
 | 
			
		||||
     */
 | 
			
		||||
    virtual void copy_to_buf(emac_mem_buf_t *to_buf, const void *ptr, uint32_t len);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Copy from a memory buffer chain
 | 
			
		||||
     *
 | 
			
		||||
     * Copies data from a memory buffer chain.
 | 
			
		||||
     *
 | 
			
		||||
     * @param len       Data length
 | 
			
		||||
     * @param ptr       Pointer to data
 | 
			
		||||
     * @param from_buf  Memory buffer chain to copy from
 | 
			
		||||
     * @return          Length of the data that was copied
 | 
			
		||||
     */
 | 
			
		||||
    virtual uint32_t copy_from_buf(void *ptr, uint32_t len, const emac_mem_buf_t *from_buf) const;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Concatenate two memory buffer chains
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -412,13 +412,19 @@ bool K64F_EMAC::link_out(emac_mem_buf_t *buf)
 | 
			
		|||
{
 | 
			
		||||
  emac_mem_buf_t *temp_pbuf;
 | 
			
		||||
 | 
			
		||||
  temp_pbuf = memory_manager->alloc_heap(memory_manager->get_total_len(buf), ENET_BUFF_ALIGNMENT);
 | 
			
		||||
  if (NULL == temp_pbuf)
 | 
			
		||||
    return false;
 | 
			
		||||
  // If buffer is chained or not aligned then make a contiguous aligned copy of it
 | 
			
		||||
  if (memory_manager->get_next(buf) ||
 | 
			
		||||
      reinterpret_cast<uint32_t>(memory_manager->get_ptr(buf)) % ENET_BUFF_ALIGNMENT) {
 | 
			
		||||
      temp_pbuf = memory_manager->alloc_heap(memory_manager->get_total_len(buf), ENET_BUFF_ALIGNMENT);
 | 
			
		||||
      if (NULL == temp_pbuf)
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
  // Copy to new buffer and free original
 | 
			
		||||
  memory_manager->copy(temp_pbuf, buf);
 | 
			
		||||
  memory_manager->free(buf);
 | 
			
		||||
      // Copy to new buffer and free original
 | 
			
		||||
      memory_manager->copy(temp_pbuf, buf);
 | 
			
		||||
      memory_manager->free(buf);
 | 
			
		||||
  } else {
 | 
			
		||||
      temp_pbuf = buf;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Check if a descriptor is available for the transfer. */
 | 
			
		||||
  if (xTXDCountSem.wait(0) == 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -525,6 +531,11 @@ uint32_t K64F_EMAC::get_mtu_size() const
 | 
			
		|||
  return K64_ETH_MTU_SIZE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t K64F_EMAC::get_align_preference() const
 | 
			
		||||
{
 | 
			
		||||
  return ENET_BUFF_ALIGNMENT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void K64F_EMAC::get_ifname(char *name, uint8_t size) const
 | 
			
		||||
{
 | 
			
		||||
  memcpy(name, K64_ETH_IF_NAME, (size < sizeof(K64_ETH_IF_NAME)) ? size : sizeof(K64_ETH_IF_NAME));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,16 @@ public:
 | 
			
		|||
     */
 | 
			
		||||
    virtual uint32_t get_mtu_size() const;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets memory buffer alignment preference
 | 
			
		||||
     *
 | 
			
		||||
     * Gets preferred memory buffer alignment of the Emac device. IP stack may or may not
 | 
			
		||||
     * align link out memory buffer chains using the alignment.
 | 
			
		||||
     *
 | 
			
		||||
     * @return         Memory alignment requirement in bytes
 | 
			
		||||
     */
 | 
			
		||||
    virtual uint32_t get_align_preference() const;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return interface name
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -480,6 +480,11 @@ uint32_t STM32_EMAC::get_mtu_size() const
 | 
			
		|||
    return STM_ETH_MTU_SIZE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t STM32_EMAC::get_align_preference() const
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void STM32_EMAC::get_ifname(char *name, uint8_t size) const
 | 
			
		||||
{
 | 
			
		||||
    memcpy(name, STM_ETH_IF_NAME, (size < sizeof(STM_ETH_IF_NAME)) ? size : sizeof(STM_ETH_IF_NAME));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,6 +33,16 @@ public:
 | 
			
		|||
     */
 | 
			
		||||
    virtual uint32_t get_mtu_size() const;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets memory buffer alignment preference
 | 
			
		||||
     *
 | 
			
		||||
     * Gets preferred memory buffer alignment of the Emac device. IP stack may or may not
 | 
			
		||||
     * align link out memory buffer chains using the alignment.
 | 
			
		||||
     *
 | 
			
		||||
     * @return         Memory alignment requirement in bytes
 | 
			
		||||
     */
 | 
			
		||||
    virtual uint32_t get_align_preference() const;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Return interface name
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue