aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mpc85xx/base-files
Commit message (Expand)AuthorAgeFilesLines
* treewide: drop shebang from non-executable target filesAdrian Schmutzler2020-06-161-1/+0
* mpc85xx: add support for Enterasys WS-AP3710iDavid Bauer2019-12-131-0/+3
* mpc85xx: correct TP-LINK TL-WDR4900 MAC addressesDavid Bauer2019-10-151-1/+1
* treewide: move MAC address patch functions to common libraryAdrian Schmutzler2019-10-141-13/+2
* treewide: move calibration data extraction function to libraryAdrian Schmutzler2019-10-131-29/+7
* treewide: convert WiFi caldata size and offset to hexadecimalAdrian Schmutzler2019-08-141-4/+4
* treewide: convert MAC address location offsets to hexadecimalAdrian Schmutzler2019-08-142-2/+2
* treewide: sysupgrade: don't use $ARGV in platform_do_upgrade()Rafał Miłecki2019-07-171-2/+2
* mpc85xx: add support for OCEDO PandaDavid Bauer2019-01-263-0/+11
* mpc85xx: use generic diag.shDavid Bauer2019-01-261-41/+0
* mpc85xx: add support for Sophos RED 15w Rev.1David Bauer2019-01-133-1/+35
* mpc85xx: add migration script for TP-Link TL-WDR4900 v1 WLAN PCI pathsMatthias Schiffer2018-09-041-0/+63
* treewide: remove obsolete sysupgrade watchdog killMathias Kresin2018-02-161-10/+0
* mpc85xx: use image metadataMathias Kresin2017-10-251-90/+3
* mpc85xx: use the generic board detectMathias Kresin2017-10-257-53/+9
* mpc85xx: update HiveAP-330 dtsChris Blake2017-10-251-17/+0
* mpc85xx: Add Aerohive HiveAP-330 Access PointChris Blake2017-10-145-5/+58
* treewide: drop target board_name functionsMathias Kresin2017-07-151-9/+0
* treewide: use the generic board_name functionMathias Kresin2017-07-154-17/+8
* treewide: populate boardname and model earlierMathias Kresin2017-07-151-0/+0
* cleanup ucidef_set_interface* usageMathias Kresin2016-09-101-1/+1
* mpc85xx: fix TL-WDR4900 mac address assignment to match original firmwareFelix Fietkau2016-02-071-0/+1
* all: drop old uci-defaults.shJo-Philipp Wich2015-12-111-1/+1
* all: remove redundant board.d/00_model filesJo-Philipp Wich2015-12-041-13/+0
* all: remove dummy ucidef_set_interface_loopback() from board.dJo-Philipp Wich2015-12-031-2/+0
* board.d: remove redundant ucidef_set_interfaces_lan_wan() callsJo-Philipp Wich2015-12-031-1/+0
* board.d: merge ucidef_add_switch() and ucidef_add_switch_ports()Jo-Philipp Wich2015-12-031-2/+1
* mpc85xx: fix typo added in r47676Jo-Philipp Wich2015-12-011-1/+1
* mpc85xx: record board id and model name in /etc/board.jsonJo-Philipp Wich2015-11-301-0/+13
* mpc85xx: convert to ucidef_add_switch_ports()Jo-Philipp Wich2015-11-301-2/+2
* mpc85xx: migrate network setup to board detection frameworkJo-Philipp Wich2015-11-201-7/+5
* mpc85xx: replace WDR4900 uci-defaults ethernet MAC address hack with DTS entryImre Kaloz2015-05-031-2/+0
* targets: base-files: diag.sh does not need to be executableLuka Perkov2015-02-071-0/+0
* targets: files in uci-defaults do not need to be executablesLuka Perkov2015-02-071-0/+0
* add "preinit_regular" diag.sh set_state argumentJohn Crispin2014-12-151-0/+4
* mpc85xx: fix WAN/LAN-MAC for TP-LINK TL-WDR4900 v1John Crispin2014-10-261-21/+5
* target/linux/*/base-files/lib/upgrade/platform.sh - wrong check for ARGCJohn Crispin2014-06-021-1/+1
* /lib/functions.sh: move rarely used mtd and macaddr related functions to /lib...Felix Fietkau2014-04-071-0/+2
* mpc85xx: Remove inittab workaroundGabor Juhos2014-01-232-29/+0
* base-files: input/button drivers get loaded before preinit by procdJohn Crispin2013-06-211-11/+0
* base-files: diag does not need to insmod any drivers, procd already did it fo...John Crispin2013-06-211-4/+0
* mpc85xx: set preinit interface to eth0 by defaultGabor Juhos2013-04-121-0/+12
* mpc85xx: add user-space support for the TL-WDR4900 v1Gabor Juhos2013-02-218-0/+315
* mpc85xx: add input drivers to default packages, and load those during preinitGabor Juhos2013-02-161-0/+11
*/ #if CH_USE_MUTEXES || defined(__DOXYGEN__) #define H_LOCK(h) chMtxLock(&(h)->h_mtx) #define H_UNLOCK(h) chMtxUnlock() #else #define H_LOCK(h) chSemWait(&(h)->h_sem) #define H_UNLOCK(h) chSemSignal(&(h)->h_sem) #endif /** * @brief Default heap descriptor. */ static MemoryHeap default_heap; /** * @brief Initializes the default heap. * * @notapi */ void heap_init(void) { default_heap.h_provider = chCoreAlloc; default_heap.h_free.h.u.next = (union heap_header *)NULL; default_heap.h_free.h.size = 0; #if CH_USE_MUTEXES || defined(__DOXYGEN__) chMtxInit(&default_heap.h_mtx); #else chSemInit(&default_heap.h_sem, 1); #endif } /** * @brief Initializes a memory heap from a static memory area. * @pre Both the heap buffer base and the heap size must be aligned to * the @p stkalign_t type size. * * @param[out] heapp pointer to the memory heap descriptor to be initialized * @param[in] buf heap buffer base * @param[in] size heap size * * @init */ void chHeapInit(MemoryHeap *heapp, void *buf, size_t size) { union heap_header *hp; chDbgCheck(MEM_IS_ALIGNED(buf) && MEM_IS_ALIGNED(size), "chHeapInit"); heapp->h_provider = (memgetfunc_t)NULL; heapp->h_free.h.u.next = hp = buf; heapp->h_free.h.size = 0; hp->h.u.next = NULL; hp->h.size = size - sizeof(union heap_header); #if CH_USE_MUTEXES || defined(__DOXYGEN__) chMtxInit(&heapp->h_mtx); #else chSemInit(&heapp->h_sem, 1); #endif } /** * @brief Allocates a block of memory from the heap by using the first-fit * algorithm. * @details The allocated block is guaranteed to be properly aligned for a * pointer data type (@p stkalign_t). * * @param[in] heapp pointer to a heap descriptor or @p NULL in order to * access the default heap. * @param[in] size the size of the block to be allocated. Note that the * allocated block may be a bit bigger than the requested * size for alignment and fragmentation reasons. * @return A pointer to the allocated block. * @retval NULL if the block cannot be allocated. * * @api */ void *chHeapAlloc(MemoryHeap *heapp, size_t size) { union heap_header *qp, *hp, *fp; if (heapp == NULL) heapp = &default_heap; size = MEM_ALIGN_SIZE(size); qp = &heapp->h_free; H_LOCK(heapp); while (qp->h.u.next != NULL) { hp = qp->h.u.next; if (hp->h.size >= size) { if (hp->h.size < size + sizeof(union heap_header)) { /* Gets the whole block even if it is slightly bigger than the requested size because the fragment would be too small to be useful.*/ qp->h.u.next = hp->h.u.next; } else { /* Block bigger enough, must split it.*/ fp = (void *)((uint8_t *)(hp) + sizeof(union heap_header) + size); fp->h.u.next = hp->h.u.next; fp->h.size = hp->h.size - sizeof(union heap_header) - size; qp->h.u.next = fp; hp->h.size = size; } hp->h.u.heap = heapp; H_UNLOCK(heapp); return (void *)(hp + 1); } qp = hp; } H_UNLOCK(heapp); /* More memory is required, tries to get it from the associated provider else fails.*/ if (heapp->h_provider) { hp = heapp->h_provider(size + sizeof(union heap_header)); if (hp != NULL) { hp->h.u.heap = heapp; hp->h.size = size; hp++; return (void *)hp; } } return NULL; } #define LIMIT(p) (union heap_header *)((uint8_t *)(p) + \ sizeof(union heap_header) + \ (p)->h.size) /** * @brief Frees a previously allocated memory block. * * @param[in] p pointer to the memory block to be freed * * @api */ void chHeapFree(void *p) { union heap_header *qp, *hp; MemoryHeap *heapp; chDbgCheck(p != NULL, "chHeapFree"); hp = (union heap_header *)p - 1; heapp = hp->h.u.heap; qp = &heapp->h_free; H_LOCK(heapp); while (TRUE) { chDbgAssert((hp < qp) || (hp >= LIMIT(qp)), "chHeapFree(), #1", "within free block"); if (((qp == &heapp->h_free) || (hp > qp)) && ((qp->h.u.next == NULL) || (hp < qp->h.u.next))) { /* Insertion after qp.*/ hp->h.u.next = qp->h.u.next; qp->h.u.next = hp; /* Verifies if the newly inserted block should be merged.*/ if (LIMIT(hp) == hp->h.u.next) { /* Merge with the next block.*/ hp->h.size += hp->h.u.next->h.size + sizeof(union heap_header); hp->h.u.next = hp->h.u.next->h.u.next; } if ((LIMIT(qp) == hp)) { /* Merge with the previous block.*/ qp->h.size += hp->h.size + sizeof(union heap_header); qp->h.u.next = hp->h.u.next; } break; } qp = qp->h.u.next; } H_UNLOCK(heapp); return; } /** * @brief Reports the heap status. * @note This function is meant to be used in the test suite, it should * not be really useful for the application code. * @note This function is not implemented when the @p CH_USE_MALLOC_HEAP * configuration option is used (it always returns zero). * * @param[in] heapp pointer to a heap descriptor or @p NULL in order to * access the default heap. * @param[in] sizep pointer to a variable that will receive the total * fragmented free space * @return The number of fragments in the heap. * * @api */ size_t chHeapStatus(MemoryHeap *heapp, size_t *sizep) { union heap_header *qp; size_t n, sz; if (heapp == NULL) heapp = &default_heap; H_LOCK(heapp); sz = 0; for (n = 0, qp = &heapp->h_free; qp->h.u.next; n++, qp = qp->h.u.next) sz += qp->h.u.next->h.size; if (sizep) *sizep = sz; H_UNLOCK(heapp); return n; } #else /* CH_USE_MALLOC_HEAP */ #include <stdlib.h> #if CH_USE_MUTEXES #define H_LOCK() chMtxLock(&hmtx) #define H_UNLOCK() chMtxUnlock() static Mutex hmtx; #elif CH_USE_SEMAPHORES #define H_LOCK() chSemWait(&hsem) #define H_UNLOCK() chSemSignal(&hsem) static Semaphore hsem; #endif void heap_init(void) { #if CH_USE_MUTEXES chMtxInit(&hmtx); #else chSemInit(&hsem, 1); #endif } void *chHeapAlloc(MemoryHeap *heapp, size_t size) { void *p; chDbgCheck(heapp == NULL, "chHeapAlloc"); H_LOCK(); p = malloc(size); H_UNLOCK(); return p; } void chHeapFree(void *p) { chDbgCheck(p != NULL, "chHeapFree"); H_LOCK(); free(p); H_UNLOCK(); } size_t chHeapStatus(MemoryHeap *heapp, size_t *sizep) { chDbgCheck(heapp == NULL, "chHeapStatus"); if (sizep) *sizep = 0; return 0; } #endif /* CH_USE_MALLOC_HEAP */ #endif /* CH_USE_HEAP */ /** @} */