# HG changeset patch # User jlarmour # Date 1010153631 0 # Node ID dd81b18e45fb84fc224da828e10d547ceea9a71c # Parent 8147f1c99f15599184007a41ae6522f0894a9c86 Merge from eCos master repository on 2002-01-04-06:43:04-GMT diff --git a/host/tools/configtool/ChangeLog b/host/tools/configtool/ChangeLog --- a/host/tools/configtool/ChangeLog +++ b/host/tools/configtool/ChangeLog @@ -1,3 +1,22 @@ +2002-01-02 Julian Smart + + * Modified these files: + + host/tools/configtool/standalone/win32/Configtool.rc + host/tools/configtool/standalone/win32/res/Splsh16.bmp + host/tools/configtool/standalone/win32/res/Splsh16_template.bmp + host/tools/configtool/standalone/wxwin/README.txt + host/tools/configtool/standalone/wxwin/about.htm + host/tools/configtool/standalone/wxwin/ecoslogosmall.png + host/tools/configtool/standalone/wxwin/reposdlg.cpp + host/tools/configtool/standalone/wxwin/bitmaps/splash16.bmp + host/tools/configtool/standalone/wxwin/bitmaps/splash16.png + host/tools/configtool/standalone/wxwin/setup/configtool.iss + host/tools/configtool/standalone/wxwin/setup/innobott.txt + host/tools/configtool/standalone/wxwin/setup/innotop.txt + + incrementing the copyright year to 2002. + 2001-12-03 Julian Smart * standalone/wxwin/templatesdlg.cpp: hardware is now sorted alphabetically diff --git a/host/tools/configtool/standalone/common/ChangeLog b/host/tools/configtool/standalone/common/ChangeLog --- a/host/tools/configtool/standalone/common/ChangeLog +++ b/host/tools/configtool/standalone/common/ChangeLog @@ -1,3 +1,10 @@ +2001-12-29 Bart Veer + + * ecosconfig.cxx, cdl_exec.cxx, cdl_exec.hxx + Add new option -n to suppress modifications to the file system, + especially ecos.ecc. Suggested by Patrick Doyle + (wpd@delcomsys.com) + 2001-12-06 Bart Veer * cdl_exec.cxx (report_conflicts): diff --git a/host/tools/configtool/standalone/common/cdl_exec.cxx b/host/tools/configtool/standalone/common/cdl_exec.cxx --- a/host/tools/configtool/standalone/common/cdl_exec.cxx +++ b/host/tools/configtool/standalone/common/cdl_exec.cxx @@ -54,6 +54,7 @@ bool cdl_exec::quiet = false; bool cdl_exec::verbose = false; bool cdl_exec::ignore_errors = false; +bool cdl_exec::no_updates = false; cdl_exec::cdl_exec (const std::string repository_arg, const std::string savefile_arg, const std::string install_arg, bool no_resolve_arg) @@ -98,6 +99,12 @@ cdl_exec::set_ignore_errors_mode(bool ne ignore_errors = new_val; } +void +cdl_exec::set_no_updates_mode(bool new_val) +{ + no_updates = new_val; +} + // ---------------------------------------------------------------------------- void cdl_exec::init(bool load_config) @@ -156,11 +163,13 @@ bool cdl_exec::cmd_new (const std::strin // Now report any conflicts which the inference engine could not report. report_conflicts(); - + // A savefile should be generated/updated even if there are conflicts. // Otherwise the user does not have a chance to edit the savefile // and fix things. - config->save (savefile); + if (!no_updates) { + config->save (savefile); + } if (ignore_errors || (0 == config->get_all_conflicts().size())) { status = true; } @@ -187,7 +196,9 @@ cdl_exec::cmd_target (const std::string config->resolve_all_conflicts(); } report_conflicts(); - config->save (savefile); + if (!no_updates) { + config->save (savefile); + } if (ignore_errors || (0 == config->get_all_conflicts().size())) { status = true; } @@ -214,7 +225,9 @@ cdl_exec::cmd_template (const std::strin config->resolve_all_conflicts(); } report_conflicts(); - config->save (savefile); + if (!no_updates) { + config->save (savefile); + } if (ignore_errors || (0 == config->get_all_conflicts().size())) { status = true; } @@ -244,7 +257,9 @@ cdl_exec::cmd_export (const std::string // configuration is conflict-free. This is different from // updating the savefile. if (ignore_errors || (0 == config->get_all_conflicts().size())) { - config->save (cdl_savefile, /* minimal = */ true); + if (!no_updates) { + config->save (cdl_savefile, /* minimal = */ true); + } status = true; } } catch (CdlStringException exception) { @@ -270,7 +285,9 @@ cdl_exec::cmd_import (const std::string config->resolve_all_conflicts(); } report_conflicts(); - config->save (savefile); + if (!no_updates) { + config->save (savefile); + } if (ignore_errors || (0 == config->get_all_conflicts().size())) { status = true; } @@ -299,7 +316,9 @@ cdl_exec::cmd_add (const std::vectorresolve_all_conflicts(); } report_conflicts(); - config->save (savefile); + if (!no_updates) { + config->save (savefile); + } if (ignore_errors || (0 == config->get_all_conflicts().size())) { status = true; } @@ -334,7 +353,9 @@ cdl_exec::cmd_remove (const std::vector< config->resolve_all_conflicts(); } report_conflicts(); - config->save (savefile); + if (!no_updates) { + config->save (savefile); + } if (ignore_errors || (0 == config->get_all_conflicts().size())) { status = true; } @@ -364,7 +385,9 @@ cdl_exec::cmd_version (const std::string config->resolve_all_conflicts(); } report_conflicts(); - config->save (savefile); + if (!no_updates) { + config->save (savefile); + } if (ignore_errors || (0 == config->get_all_conflicts().size())) { status = true; } @@ -390,9 +413,15 @@ cdl_exec::cmd_tree () config->resolve_all_conflicts(); } report_conflicts(); - config->save (savefile); - // A build tree should only be generated if there are no conflicts. - if (ignore_errors || (0 == config->get_all_conflicts().size())) { + if (!no_updates) { + config->save (savefile); + } + // A build tree should only be generated if there are no conflicts, + // and suppressed if -n is given. + if (no_updates) { + // Do nothing + } + else if (ignore_errors || (0 == config->get_all_conflicts().size())) { #ifdef _MSC_VER char cwd [_MAX_PATH + 1]; #else @@ -527,7 +556,9 @@ cdl_exec::cmd_check () // change. // However, updating the savefile is worthwhile because it // will now contain more accurate information about the state. - config->save (savefile); + if (!no_updates) { + config->save (savefile); + } // report current target and template printf ("Target: %s\n", config->get_hardware ().c_str ()); @@ -615,7 +646,9 @@ cdl_exec::cmd_resolve () CdlTransactionBody::set_callback_fn(&transaction_callback); config->resolve_all_conflicts (); report_conflicts(); - config->save (savefile); + if (!no_updates) { + config->save (savefile); + } if (ignore_errors || (0 == config->get_all_conflicts().size())) { status = true; } diff --git a/host/tools/configtool/standalone/common/cdl_exec.hxx b/host/tools/configtool/standalone/common/cdl_exec.hxx --- a/host/tools/configtool/standalone/common/cdl_exec.hxx +++ b/host/tools/configtool/standalone/common/cdl_exec.hxx @@ -1,7 +1,7 @@ //####COPYRIGHTBEGIN#### // // ---------------------------------------------------------------------------- -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // // This program is part of the eCos host tools. // @@ -43,11 +43,13 @@ public: static void set_quiet_mode(bool); static void set_verbose_mode(bool); static void set_ignore_errors_mode(bool); + static void set_no_updates_mode(bool); protected: static bool quiet; static bool verbose; static bool ignore_errors; + static bool no_updates; std::string repository; std::string savefile; std::string install_prefix; diff --git a/host/tools/configtool/standalone/common/ecosconfig.cxx b/host/tools/configtool/standalone/common/ecosconfig.cxx --- a/host/tools/configtool/standalone/common/ecosconfig.cxx +++ b/host/tools/configtool/standalone/common/ecosconfig.cxx @@ -1,7 +1,7 @@ //####COPYRIGHTBEGIN#### // // ---------------------------------------------------------------------------- -// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. // // This program is part of the eCos host tools. // @@ -50,7 +50,7 @@ #include "ecosconfig.hxx" #define TOOL_VERSION "1.3.net" -#define TOOL_COPYRIGHT "Copyright (c) 2001 Red Hat, Inc." +#define TOOL_COPYRIGHT "Copyright (c) 2002 Red Hat, Inc." #define DEFAULT_SAVE_FILE "ecos.ecc" static char* tool = "ecosconfig"; @@ -89,6 +89,7 @@ int main (int argc, char * argv []) { bool quiet = false; // -q, --quiet bool verbose = false; // -v, --verbose bool ignore_errors = false; // -i, --ignore-errors + bool no_updates = false; // -n, --no-updates, bool help = false; // --help // getopt() cannot easily be used here since this code has to @@ -110,6 +111,8 @@ int main (int argc, char * argv []) { } else if ((0 == strcmp(arg, "-i")) || (0 == strcmp(arg, "--ignore-errors"))) { // Duplicate use of -i and the other flags is harmless. ignore_errors = true; + } else if ((0 == strcmp(arg, "-n")) || (0 == strcmp(arg, "--no-updates"))) { + no_updates = true; } else if (0 == strcmp(arg, "--version")) { version = true; } else if (0 == strcmp(arg, "--no-resolve")) { @@ -206,6 +209,7 @@ int main (int argc, char * argv []) { printf("no_resolve is %d\n", no_resolve); printf("quiet is %d\n", quiet); printf("verbose is %d\n", verbose); + printf("no-updates is %d\n", no_updates); printf("ignore_errors is %d\n", ignore_errors); printf("repository is %s\n", repository.c_str()); printf("savefile is %s\n", savefile.c_str()); @@ -275,6 +279,7 @@ int main (int argc, char * argv []) { cdl_exec::set_quiet_mode(quiet); cdl_exec::set_verbose_mode(verbose); cdl_exec::set_ignore_errors_mode(ignore_errors); + cdl_exec::set_no_updates_mode(no_updates); // Now identify and process the sub-command. const std::string command = argv [command_index]; @@ -442,5 +447,6 @@ void usage_message () { printf (" -q, --quiet : reduce verbosity\n"); printf (" -v, --verbose : increase verbosity\n"); printf (" -i, --ignore-errors : ignore unresolved conflicts\n"); + printf (" -n, --no-updates : read-only mode, do not modify the file system\n"); printf (" --help : display this message\n"); } diff --git a/host/tools/configtool/standalone/win32/Configtool.rc b/host/tools/configtool/standalone/win32/Configtool.rc --- a/host/tools/configtool/standalone/win32/Configtool.rc +++ b/host/tools/configtool/standalone/win32/Configtool.rc @@ -78,7 +78,7 @@ END // Menu // -IDR_MAINFRAME MENU DISCARDABLE +IDR_MAINFRAME MENU DISCARDABLE BEGIN POPUP "&File" BEGIN @@ -168,7 +168,7 @@ BEGIN END END -IDR_OUTPUT_CONTEXT MENU DISCARDABLE +IDR_OUTPUT_CONTEXT MENU DISCARDABLE BEGIN POPUP "Popup" BEGIN @@ -196,7 +196,7 @@ BEGIN SS_NOPREFIX ICON IDR_MAINFRAME,IDC_STATIC,11,17,21,20 LTEXT "Date/Time info",IDC_STATIC_DATETIME,40,23,119,8 - LTEXT "Copyright © 1998-2001 Red Hat, Inc.",IDC_STATIC,40,36, + LTEXT "Copyright © 1998-2002 Red Hat, Inc.",IDC_STATIC,40,36, 170,8 CONTROL "",IDC_STATIC,"Static",SS_GRAYFRAME,8,57,201,133, WS_EX_DLGMODALFRAME | WS_EX_TRANSPARENT @@ -226,7 +226,7 @@ BEGIN "Button",BS_AUTORADIOBUTTON,15,100,204,10 CONTROL "This &browser:",IDC_RADIO_CUSTOM_BROWSER,"Button", BS_AUTORADIOBUTTON,15,114,58,10 - EDITTEXT IDC_EDIT_BROWSER,15,132,205,14,ES_AUTOHSCROLL | + EDITTEXT IDC_EDIT_BROWSER,15,132,205,14,ES_AUTOHSCROLL | WS_DISABLED PUSHBUTTON "Br&owse...",IDC_BROWSE_BROWSER,170,112,50,14, WS_DISABLED | WS_GROUP @@ -237,13 +237,13 @@ BEGIN CONTROL "Use descriptive &names",IDC_RADIO_DESCRIPTIVE_NAMES, "Button",BS_AUTORADIOBUTTON,102,183,87,10 GROUPBOX "Integer items",IDC_STATIC,16,202,201,26 - CONTROL "&Decimal",IDC_RADIO_DECIMAL,"Button",BS_AUTORADIOBUTTON | + CONTROL "&Decimal",IDC_RADIO_DECIMAL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,25,213,41,10 CONTROL "He&xadecimal",IDC_RADIO_HEXADECIMAL,"Button", BS_AUTORADIOBUTTON,102,213,57,10 GROUPBOX "Font",IDC_STATIC,7,244,220,31 LTEXT "&Window:",IDC_STATIC,18,257,29,8 - COMBOBOX IDC_PANECOMBO,49,255,79,67,CBS_DROPDOWNLIST | WS_VSCROLL | + COMBOBOX IDC_PANECOMBO,49,255,79,67,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Change &Font...",IDC_FONT,165,254,52,14 PUSHBUTTON "OK",IDOK,121,281,50,14 @@ -256,7 +256,7 @@ CAPTION "Header Files" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Close",IDOK,221,7,50,14 - LISTBOX IDC_LIST,7,29,264,112,LBS_SORT | LBS_NOINTEGRALHEIGHT | + LISTBOX IDC_LIST,7,29,264,112,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP LTEXT "Double-click any item below to edit the file", IDC_HEADERSTATIC,7,13,133,8 @@ -271,7 +271,7 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,214,25,50,14 PUSHBUTTON "&Browse...",IDC_FOLDER_DIALOG_BROWSE,214,43,50,14 LTEXT "Static",IDC_STATIC_DESC,8,7,196,46 - COMBOBOX IDC_FOLDER,6,61,258,57,CBS_DROPDOWN | CBS_AUTOHSCROLL | + COMBOBOX IDC_FOLDER,6,61,258,57,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP END @@ -288,7 +288,7 @@ BEGIN CONTROL "Use &descriptive names",IDC_RADIO_DESCRIPTIVE_NAMES, "Button",BS_AUTORADIOBUTTON,142,44,87,10 GROUPBOX "Integer items",IDC_STATIC,7,65,228,31 - CONTROL "D&ecimal",IDC_RADIO_DECIMAL,"Button",BS_AUTORADIOBUTTON | + CONTROL "D&ecimal",IDC_RADIO_DECIMAL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,19,79,41,10 CONTROL "He&xadecimal",IDC_RADIO_HEXADECIMAL,"Button", BS_AUTORADIOBUTTON,142,79,57,10 @@ -302,7 +302,7 @@ END // Accelerator // -IDR_MAINFRAME ACCELERATORS MOVEABLE PURE +IDR_MAINFRAME ACCELERATORS MOVEABLE PURE BEGIN "1", ID_VIEW_PROPERTIES, VIRTKEY, ALT, NOINVERT "2", ID_VIEW_CONFLICTS, VIRTKEY, ALT, NOINVERT @@ -312,7 +312,7 @@ BEGIN "F", ID_EDIT_FIND, VIRTKEY, CONTROL, NOINVERT "N", ID_FILE_NEW, VIRTKEY, CONTROL, NOINVERT "O", ID_FILE_OPEN, VIRTKEY, CONTROL, NOINVERT - "P", ID_ENABLE_EXTENSIONS, VIRTKEY, SHIFT, CONTROL, ALT, + "P", ID_ENABLE_EXTENSIONS, VIRTKEY, SHIFT, CONTROL, ALT, NOINVERT "S", ID_FILE_SAVE, VIRTKEY, CONTROL, NOINVERT VK_F3, ID_EDIT_FINDAGAIN, VIRTKEY, NOINVERT @@ -379,7 +379,7 @@ END // #ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO DISCARDABLE +GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_ABOUTBOX, DIALOG BEGIN @@ -411,12 +411,12 @@ END // TEXTINCLUDE // -1 TEXTINCLUDE DISCARDABLE +1 TEXTINCLUDE DISCARDABLE BEGIN "CTres.h\0" END -3 TEXTINCLUDE DISCARDABLE +3 TEXTINCLUDE DISCARDABLE BEGIN "#define _AFX_NO_SPLITTER_RESOURCES\r\n" "#define _AFX_NO_OLE_RESOURCES\r\n" @@ -436,7 +436,7 @@ BEGIN "#endif\0" END -2 TEXTINCLUDE DISCARDABLE +2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "#include ""CTCommonres.h""\r\n" @@ -452,15 +452,15 @@ END // String Table // -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN AFX_IDS_APP_TITLE "Configuration Tool" AFX_IDS_IDLEMESSAGE "Ready" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN - IDC_RADIO_INTERNAL_BROWSER + IDC_RADIO_INTERNAL_BROWSER "Select the internal HTML help mechanism to display HTML-based help." IDC_PANECOMBO "Selects a window for which the font is to be changed." IDC_FONT "Changes the font of the chosen window." @@ -471,7 +471,7 @@ BEGIN IDS_ECOS_PR_URL "http://www.cygnus.com/ecos/ecos-pr.html" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_THERMOMETER "." ID_RUN_SIM "Runs the configuration tests\nRun Tests" @@ -483,14 +483,14 @@ BEGIN ID_VIEW_OUTPUT "Activates the output window\nOutput window" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_BUILD_STOP "Stops the build\nStop Build" ID_CONFIGURATION_OPTIONS "Changes configuration options\nChange options" ID_BUILD_TESTS "Builds the configuration tests\nBuild tests" - ID_CONFIGURATION_CHECKRULES + ID_CONFIGURATION_CHECKRULES "Checks rules immediately\nCheck option dependency rules immediately options are changed " - ID_CONFIGURATION_REFRESH + ID_CONFIGURATION_REFRESH "Reloads configuration settings from header files\nReload configuration" ID_CONFIGURATION_REPOSITORY "Selects repository\nSelect repository" ID_VIEW_SETTINGS "Enables you to change settings\nChange settings" @@ -505,10 +505,10 @@ BEGIN ID_GNUPRO_DOCUMENTATION "Opens the GNUPro documentation page\nGNUPro Documentation" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_HELP_SUBMIT_PR "Opens a page to submit an eCos problem report\nSubmit Problem Report" - ID_HELP_GNUPRO_DOCUMENTATION + ID_HELP_GNUPRO_DOCUMENTATION "Opens the GNUPro documentation page\nGNUPro Documentation Page" ID_HELP_ECOS "Opens the eCos net release page\neCos Net Release Page" ID_HELP_UITRON "Opens the µITRON specification page\nµITRON Specification" @@ -525,18 +525,18 @@ BEGIN ID_VIEW_CONFLICTS "Activates the conflicts window\nConflicts window" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN IDC_BROWSE_BROWSER "Browses for a browser to be used to display HTML-based help." IDC_RADIO_ASSOCIATED "Select the default viewer to display header files." IDC_RADIO_CUSTOM "Select a viewer of your choice to display header files." - IDC_RADIO_ASSOCIATED_BROWSER + IDC_RADIO_ASSOCIATED_BROWSER "Select the default browser to display HTML-based help." - IDC_RADIO_CUSTOM_BROWSER + IDC_RADIO_CUSTOM_BROWSER "Select a browser of your choice to display HTML-based help." END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_INDICATOR_EXT "EXT" ID_INDICATOR_CAPS "CAP" @@ -546,7 +546,7 @@ BEGIN ID_INDICATOR_REC "REC" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_FILE_NEW "Creates a new document\nNew" ID_FILE_OPEN "Opens an existing document\nOpen" @@ -559,14 +559,14 @@ BEGIN ID_FILE_PRINT_PREVIEW "Displays full pages\nPrint Preview" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_APP_ABOUT "Displays program information, version number and copyright\nAbout" ID_APP_EXIT "Quits the application; prompts to save documents\nExit" ID_HELP "Displays help\nHelp" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_FILE_MRU_FILE1 "Opens this document" ID_FILE_MRU_FILE2 "Opens this document" @@ -586,12 +586,12 @@ BEGIN ID_FILE_MRU_FILE16 "Opens this document" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_WINDOW_SPLIT "Splits the active window into panes\nSplit" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_EDIT_CLEAR "Clears the output pane\nClear" ID_EDIT_CLEAR_ALL "Erases everything in the output pane\nErase All" @@ -606,18 +606,18 @@ BEGIN ID_EDIT_REDO "Redoes the previously undone action\nRedo" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_VIEW_TOOLBAR "Shows or hides the standard toolbar\nToggle Standard ToolBar" ID_VIEW_STATUS_BAR "Shows or hide the status bar\nToggle StatusBar" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN IDS_REGKEY "Red Hat\\eCos" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_POPUP_PROPERTIES "Displays the properties of the selected item" ID_EDIT_NEW_REGION "Add a new memory region\nNew Region" @@ -626,7 +626,7 @@ BEGIN ID_EDIT_PROPERTIES "Show the properties of a memory region or section\nProperties" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_VIEW_MLTBAR "Shows or hides the memory layout toolbar\nToggle Memory Layout ToolBar" ID_TOOLS_ADMINISTRATION "Performs Repository Administration Tasks\nAdminister repository" @@ -635,7 +635,7 @@ BEGIN ID_EDIT_PLATFORMS "Edits the platform list\nEdit Platforms" END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN IDC_EDIT "Specify the viewer executable to be used to display header files." IDC_EDIT_BROWSER "Specify the browser executable to be used to display header files." @@ -643,7 +643,7 @@ BEGIN IDC_BROWSE "Browses for a viewer to be used to display header files." END -STRINGTABLE DISCARDABLE +STRINGTABLE DISCARDABLE BEGIN ID_RESOLVE_CONFLICTS "Resolves conflicts\nResolve conflicts" END diff --git a/host/tools/configtool/standalone/win32/res/Splsh16.bmp b/host/tools/configtool/standalone/win32/res/Splsh16.bmp index b19abe7a371af445f54e8fdf3df6d493136e8017..4a9b0492d1b20f27bd5d2228cc02a518de447e2f GIT binary patch literal 166438 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 IK@dCt4 eCos Configuration Tool Version $VERSION$
$DATE$
- Copyright (c) 1998-2001
+ Copyright (c) 1998-2002
Red Hat, Inc. @@ -36,7 +36,7 @@ The eCos engineering team is: - + @@ -46,7 +46,7 @@ Paul Beskeen
John Dallaway
Robert Erksine
-Simon FitzMaurice
+Simon Fitzmaurice
Mark Galassi
Nick Garnett
Tim Goodwin
@@ -58,7 +58,7 @@ Drew Moseley

- + @@ -81,7 +81,7 @@ Bart Veer

- + diff --git a/host/tools/configtool/standalone/wxwin/bitmaps/splash16.bmp b/host/tools/configtool/standalone/wxwin/bitmaps/splash16.bmp index 72bba6b3ddb10501f03d5844aebc2eca9d3b474d..0d26f338448b69422e39b3be8bb34970464ce3c1 GIT binary patch literal 82798 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 B&WZp4 diff --git a/host/tools/configtool/standalone/wxwin/bitmaps/splash16.png b/host/tools/configtool/standalone/wxwin/bitmaps/splash16.png index 7351f93a5be6debeb0c3cac487e32ffe300cdca1..745f00291613e75e32527414770c181c24e7cadf GIT binary patch literal 4556 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 S^5HW8{gu9sv33pG75gvhW&O?o diff --git a/host/tools/configtool/standalone/wxwin/ecoslogosmall.png b/host/tools/configtool/standalone/wxwin/ecoslogosmall.png index 1432646221a9cefe2983517893b205c447b4a3f0..02a1533a579f7a251f8f55760160661a47cf37c9 GIT binary patch literal 2443 zc%0?d`#)6c9tZFty=D-mq7*}8Bct0HQ6`m45z~z^R6~g&hf!#TE(_TjL{r)AWxKSx zpyk?fc88VNR-{Z98QD$KD{9*HN>fg!wdH8-qUJo)-si74pVxbRp6~O_JnJ<-PEqLA zjaC-(Eod~FRY>p#Ay_lOo ztd1XB0KPz%hinO?|7v1tZQ|0?+{6S&=4rt@Wi*<#-1wMCU0bv?+B90|W>Fx`7zT}D z42{8LFqj}ThCKsd+S>#6_H27FvzcIJv%fvyfWu~UH~@#kWOMD=TsFYrayVQr2Mjz8 zm&fPwIL6}h0X`T6JidU>6Y%*00U!_vjV%-kgkphE0ti9GAbi1}JBe5JiD6h<%vMi2xA6AES&Ls1MvG2Gaoa16t73@3~Ofg3{* zIHAJ93`(sc2;v54waOT^8XOTSwF;D0rP8WFtF>w)om#8?-v&%Ntxl)=YXQ;gWfDCk z)hlFrC8Sp>^srKoAbJ!)^%#KZaRAp7gkG)ItF?M?2i!7-)RQF1XOjYeLka;dDddr2 zfKN&Uq*O@C#3UpkAt|YlkxGb!6(p=A5tu{)gv3x1!$=$@anLwP5Tr^)YPF;ey!y|# zgHR-CpadLB$fbllN(}HR2_T@PLP`dRDVcT&su#!R)6apHiPynGY z0Htt@!f}cK2ucO0D3zL0t0^s@rL;Oq2k0q1VEhFXNqvjKfFTAPHQ<}4{;B4v=;=Ps!DB1(I|66sod&quA0{P7P82x;`oxr_$S#dety4X#x3;tJ?G@}&U2}+ z`=QjmDa@}n-1;pkKF*65&Dq@=eQj#o;?+yrNcL^)+ck zUS@UmFTUq^`}||wq4oUGGTUQdo>_KHHXuB7F_5ac>$M_P6ClRKHCdd2lo!F!Ma>l(-RVfRYbJMGaRawrOm?`$rQoR$BdcepRq% zX$RAM)FXPk>#QrE?ECHa)(@Abr+WDn<)lyD>3=joegc~mcRAY6Z53%)7mnRXyXv1? z-i}vk5@UG z#BGk)V>rmgPpxCo=Q}tY%nFQLL>``~`_L&XTQ;>S*KU-#GwDNovdfZXpIzj)y07^= zTGv&e9nbPzMvqvgow}pT39^X1A;=-tDHD5wXIN?M7K$9o@As}g^Xp2}A76ioyZxJ6 z!>1bCAP?Vbizn9B@7$X(5;1V|T?{-FR9^BoyU^8vNTz9|ZCLfyxj%o2d$`<2^AcH7 zt$jB=@mWOEoqdrZu|Iqsy<6SW(OOnpRG1WZF|53Do4L04ZVA1#YPTixop5^Xd+(xb zzi#j5vw!eHDy-@)x?ZuaM?KkoWsQHz`aa>wrB(2KpW|2Lww1G2jWW!ZwCoEmj$VBD zlHazj3+7b`^^YylhPD$L>SDvP!!<|fGx8(@oBAInJL!*<)#R~AO-SMz^!%cYfk}dq zcMmNsR?Lg8Ojej?Wwq?q7G)Q9d)L-je_zNeusG{_+q?Ld*MUd#qAEMS&VF0h^lI#* zW0Cu=bp?CqDUB`*JSIIC?nt9KmhY|q1l8=FsQz%~qw+NsQ==M-jm{e# zj2m-yg{$BBwj_rRbI}h$8E+O|R<@7F_V*@1^q38H=a6voC(dy9Kkt@t1}D?I<`0IO zq87h2YO18qMa}f0H5uEJS~4FJlf$c6ofipg`o`d=FQ(jTRepository Information\n"); info += wxT("\n"); info += wxT(""); info += wxT("
\n"); - if (wxFileExists(ecosLogo)) - { - wxString s; - s.Printf(wxT("

"), ecosLogo.c_str()); - info += s; - } + wxString s; + s.Printf(wxT("

")); + info += s; info += wxT("

\n"); info += wxT("Repository Information\n"); diff --git a/host/tools/configtool/standalone/wxwin/setup/configtool.iss b/host/tools/configtool/standalone/wxwin/setup/configtool.iss --- a/host/tools/configtool/standalone/wxwin/setup/configtool.iss +++ b/host/tools/configtool/standalone/wxwin/setup/configtool.iss @@ -11,7 +11,7 @@ UsePreviousGroup=1 AppVersion=2.09 AppVerName=eCos Configuration Tool 2.09 - AppCopyright=Copyright © Red Hat Inc., 2001 + AppCopyright=Copyright © Red Hat Inc., 2001-2002 BackColor=$FF0000 BackColor2=$000000 BackColorDirection=toptobottom @@ -218,5 +218,5 @@ ;AddVerTo=AppVerName ;SetupFilename=setup.exe ;OutputFolder=v:\setup -;CopyrightText=Copyright © Red Hat Inc., 2001 +;CopyrightText=Copyright © Red Hat Inc., 2001-2002 diff --git a/host/tools/configtool/standalone/wxwin/setup/innobott.txt b/host/tools/configtool/standalone/wxwin/setup/innobott.txt --- a/host/tools/configtool/standalone/wxwin/setup/innobott.txt +++ b/host/tools/configtool/standalone/wxwin/setup/innobott.txt @@ -35,5 +35,5 @@ ;AddVerTo=AppVerName ;SetupFilename=setup.exe ;OutputFolder=v:\setup -;CopyrightText=Copyright © Red Hat Inc., 2001 +;CopyrightText=Copyright © Red Hat Inc., 2001-2002 diff --git a/host/tools/configtool/standalone/wxwin/setup/innotop.txt b/host/tools/configtool/standalone/wxwin/setup/innotop.txt --- a/host/tools/configtool/standalone/wxwin/setup/innotop.txt +++ b/host/tools/configtool/standalone/wxwin/setup/innotop.txt @@ -11,7 +11,7 @@ UsePreviousGroup=1 AppVersion=%VERSION% AppVerName=eCos Configuration Tool %VERSION% - AppCopyright=Copyright © Red Hat Inc., 2001 + AppCopyright=Copyright © Red Hat Inc., 2001-2002 BackColor=$FF0000 BackColor2=$000000 BackColorDirection=toptobottom diff --git a/packages/ChangeLog b/packages/ChangeLog --- a/packages/ChangeLog +++ b/packages/ChangeLog @@ -1,3 +1,11 @@ +2002-01-03 Mark Salter + + * ecos.db: Use generic i82559 driver for iq80310. + +2001-12-20 Koichi Nagashima + + * ecos.db: Add CqREEK SH7750 flash driver. + 2001-11-22 Jesper Skov * pkgconf/rules.mak: Added HOST_CC definition. This really belongs diff --git a/packages/NEWS b/packages/NEWS --- a/packages/NEWS +++ b/packages/NEWS @@ -1,3 +1,4 @@ +* CqREEK SH7750 FLASH driver added, contributed by Koichi Nagashima * EDB7xxx ethernet driver rewritten to be a generic Cirrus Logic CS8900A package. * Incorporated FTP client code (library and test) from Andrew Lunn. diff --git a/packages/devs/eth/arm/iq80310/current/ChangeLog b/packages/devs/eth/arm/iq80310/current/ChangeLog --- a/packages/devs/eth/arm/iq80310/current/ChangeLog +++ b/packages/devs/eth/arm/iq80310/current/ChangeLog @@ -1,3 +1,11 @@ +2002-01-03 Mark Salter + + * cdl/iq80310_eth_drivers.cdl: Rewrite to use generic i82559 driver. + * include/devs_eth_iq80310.inl: New file. + * src/if_iq80310.c: Remove. + * src/if_shmem.S: Remove. + * include/iq80310_info.h: Remove. + 2001-12-20 Mark Salter * cdl/iq80310_eth_drivers.cdl: Add "flavor data" (as pointed out by diff --git a/packages/devs/eth/arm/iq80310/current/cdl/iq80310_eth_drivers.cdl b/packages/devs/eth/arm/iq80310/current/cdl/iq80310_eth_drivers.cdl --- a/packages/devs/eth/arm/iq80310/current/cdl/iq80310_eth_drivers.cdl +++ b/packages/devs/eth/arm/iq80310/current/cdl/iq80310_eth_drivers.cdl @@ -48,132 +48,93 @@ cdl_package CYGPKG_DEVS_ETH_ARM_IQ80310 active_if CYGPKG_IO_ETH_DRIVERS active_if CYGPKG_HAL_ARM_IQ80310 - implements CYGHWR_NET_DRIVER_ETH0 - implements CYGHWR_NET_DRIVER_ETH1 - # yes, there should be two of these "implement"s - implements CYGHWR_NET_DRIVERS - implements CYGHWR_NET_DRIVERS - include_dir cyg/devs/eth + include_dir cyg/io - # SNMP demands to know stuff; this sadly makes us break the neat - # abstraction of the device having nothing exported. - # The other one is used by other tests: - include_files include/iq80310_info.h - # and tell them that it is available - define_proc { - puts $::cdl_system_header \ - "#define CYGBLD_DEVS_ETH_DEVICE_H " + # FIXME: This really belongs in the INTEL_I82559 package + cdl_interface CYGINT_DEVS_ETH_INTEL_I82559_REQUIRED { + display "Intel i82559 ethernet driver required" } - description "Ethernet driver for Intel IQ80310 with PRO/100+ boards." - compile -library=libextras.a if_iq80310.c if_shmem.S - - cdl_option CYGDBG_DEVS_ETH_ARM_IQ80310_CHATTER { - display "Prints ethernet device status info during startup" - default_value 0 - description " - The ethernet device initialization code can print lots of info - to confirm that it has found the devices on the PCI bus, read - the MAC address from EEPROM correctly, and so on, and also - displays the mode (10/100MHz, half/full duplex) of the - connection." - } - - cdl_option CYGNUM_DEVS_ETH_ARM_IQ80310_DEV_COUNT { - display "Number of supported interfaces." - legal_values 1 2 - default_value 2 - flavor data - description " - This option selects the number of PCI ethernet interfaces to - be supported by the driver." - } - - cdl_option CYGNUM_DEVS_ETH_ARM_IQ80310_MAX_RX_DESCRIPTORS { - display "Maximum number of RX descriptors" - flavor data - default_value { CYGPKG_REDBOOT ? 4 : 128 } - define MAX_RX_DESCRIPTORS - description " - An RX descriptor is used for each ethernet frame required - to be passed to the upper networking layers. This option - sets the maximum number of these. Higher numbers use more - memory, lower numbers will reduce performance. The system - appears to work OK with as few as 8 descriptors but limps - painfully with only 4. Performance is better with more than - 8, but since the size of non-cached (so useless for anything - else) memory window is 1Mb, we might as well use it all. - 128 RX and TX descriptors uses the whole 1Mb, near enough." + define_proc { + puts $::cdl_system_header "/***** ethernet driver proc output start *****/" + puts $::cdl_system_header "#define CYGDAT_DEVS_ETH_INTEL_I82559_INL " + puts $::cdl_system_header "#define CYGDAT_DEVS_ETH_INTEL_I82559_CFG " + puts $::cdl_system_header "/***** ethernet driver proc output end *****/" } - cdl_option CYGNUM_DEVS_ETH_ARM_IQ80310_MAX_TX_DESCRIPTORS { - display "Maximum number of TX descriptors" - flavor data - default_value { CYGPKG_REDBOOT ? 4 : 128 } - define MAX_TX_DESCRIPTORS + + cdl_component CYGPKG_DEVS_ETH_ARM_IQ80310_ETH0 { + display "IQ80310 builtin ethernet port driver" + flavor bool + default_value 1 description " - A TX descriptor is used for each ethernet frame passed down - from upper networking layers for transmission. This option - sets the maximum number of these. Higher numbers use more - memory, lower numbers will reduce performance. The system - appears to work OK with as few as 8 descriptors but limps - painfully with only 4. Performance is better with more than - 8, but since the size of non-cached (so useless for anything - else) memory window is 1Mb, we might as well use it all. - 128 RX and TX descriptors uses the whole 1Mb, near enough." - } + This option includes the ethernet device driver for the + IQ80310 builtin port." + + implements CYGHWR_NET_DRIVERS + implements CYGHWR_NET_DRIVER_ETH0 + implements CYGINT_DEVS_ETH_INTEL_I82559_REQUIRED - cdl_component CYGDBG_DEVS_ETH_ARM_IQ80310_KEEP_STATISTICS { - display "Keep Ethernet statistics" - default_value 1 - description " - The ethernet device can maintain statistics about the network, - specifically a great variety of error rates which are useful - for network management. SNMP for example uses this - information. There is some performance cost in maintaining - this information; disable this option to recoup that." + cdl_option CYGDAT_DEVS_ETH_ARM_IQ80310_ETH0_NAME { + display "Device name for the ETH0 ethernet port driver" + flavor data + default_value {"\"eth0\""} + description " + This option sets the name of the ethernet device for the + IQ80310 builtin port." + } - cdl_option CYGDBG_DEVS_ETH_ARM_IQ80310_KEEP_82559_STATISTICS { - display "Keep i82559 Internal statistics" - default_value 1 - description " - The i82559 keeps internal counters, and it is possible to - acquire these. But the i82559 (reputedly) does not service - the network whilst uploading the data to RAM from its - internal registers. If throughput is a problem, disable - this option to acquire only those statistics gathered by - software, so that the i82559 never sleeps." - } - } + cdl_option CYGNUM_DEVS_ETH_ARM_IQ80310_MAX_RX_DESCRIPTORS { + display "Maximum number of RX descriptors" + flavor data + default_value { CYGPKG_REDBOOT ? 4 : 128 } + define MAX_RX_DESCRIPTORS + description " + An RX descriptor is used for each ethernet frame required + to be passed to the upper networking layers. This option + sets the maximum number of these. Higher numbers use more + memory, lower numbers will reduce performance. The system + appears to work OK with as few as 8 descriptors but limps + painfully with only 4. Performance is better with more than + 8, but since the size of non-cached (so useless for anything + else) memory window is 1Mb, we might as well use it all. + 128 RX and TX descriptors uses the whole 1Mb, near enough." + } + + cdl_option CYGNUM_DEVS_ETH_ARM_IQ80310_MAX_TX_DESCRIPTORS { + display "Maximum number of TX descriptors" + flavor data + default_value { CYGPKG_REDBOOT ? 4 : 128 } + define MAX_TX_DESCRIPTORS + description " + A TX descriptor is used for each ethernet frame passed down + from upper networking layers for transmission. This option + sets the maximum number of these. Higher numbers use more + memory, lower numbers will reduce performance. The system + appears to work OK with as few as 8 descriptors but limps + painfully with only 4. Performance is better with more than + 8, but since the size of non-cached (so useless for anything + else) memory window is 1Mb, we might as well use it all. + 128 RX and TX descriptors uses the whole 1Mb, near enough." + } - cdl_component CYGPKG_DEVS_ETH_ARM_IQ80310_WRITE_EEPROM { - display "SIOCSIFHWADDR records MAC address in EEPROM" - default_value 0 - description " - The ioctl() socket call with operand SIOCSIFHWADDR sets the - interface hardware address - the MAC address or ethernet - address. This option causes the new MAC address to be written - into the EEPROM associated with the interface, so that the new - MAC address is permanently recorded. Doing this should be a - carefully chosen decision, hence this option." - } + cdl_component CYGSEM_DEVS_ETH_ARM_IQ80310_ETH0_SET_ESA { + display "Set the ethernet station address" + flavor bool + default_value 0 + description "Enabling this option will allow the ethernet + station address to be forced to the value set by the + configuration. This may be required if the hardware does + not include a serial EEPROM for the ESA." + + cdl_option CYGDAT_DEVS_ETH_ARM_IQ80310_ETH0_ESA { + display "The ethernet station address" + flavor data + default_value {"{0x00, 0xB5, 0xE0, 0xB5, 0xE0, 0x11}"} + description "The ethernet station address" + } + } - cdl_component CYGPKG_DEVS_ETH_ARM_IQ80310_OPTIONS { - display "Intel IQ80310 with PRO/100+ ethernet driver build options" - flavor none - no_define - - cdl_option CYGPKG_DEVS_ETH_ARM_IQ80310_CFLAGS_ADD { - display "Additional compiler flags" - flavor data - no_define - default_value { "-D_KERNEL -D__ECOS" } - description " - This option modifies the set of compiler flags for - building the Intel IQ80310 with PRO/100+ ethernet driver - package. These flags are used in addition to the set of - global flags." - } } } diff --git a/packages/devs/eth/arm/iq80310/current/include/devs_eth_iq80310.inl b/packages/devs/eth/arm/iq80310/current/include/devs_eth_iq80310.inl new file mode 100644 --- /dev/null +++ b/packages/devs/eth/arm/iq80310/current/include/devs_eth_iq80310.inl @@ -0,0 +1,126 @@ +//========================================================================== +// +// devs/eth/arm/iq80310/include/devs_eth_arm_iq80310.inl +// +// IQ80310 ethernet I/O definitions. +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (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.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): msalter +// Contributors:msalter +// Date: 2001-12-20 +// Purpose: IQ80310 ethernet defintions +//####DESCRIPTIONEND#### +//========================================================================== + +#include // CYGNUM_HAL_INTERRUPT_ETHERNET +#include // HAL_DCACHE_LINE_SIZE +#include // CYGARC_UNCACHED_ADDRESS + +#ifdef CYGPKG_DEVS_ETH_ARM_IQ80310_ETH0 + +// Bus masters can get to all of SDRAM using direct mapping. +#define CYGHWR_INTEL_I82559_PCI_VIRT_TO_BUS( _x_ ) ((cyg_uint32)CYGARC_VIRT_TO_BUS(_x_)) + +#ifndef CYGSEM_DEVS_ETH_ARM_IQ80310_ETH0_SET_ESA +# define CYGHWR_DEVS_ETH_INTEL_I82559_HAS_ONE_EEPROM 0 +# define CYGHWR_DEVS_ETH_INTEL_I82559_HAS_ONE_EEPROM_WITHOUT_CRC +#endif + +#define MAX_PACKET_SIZE 1536 +#define SIZEOF_DESCRIPTOR 16 +#define MISC_MEM 1128 // selftest, ioctl and statistics + +#define CYGHWR_INTEL_I82559_PCI_MEM_MAP_SIZE \ + (((MAX_PACKET_SIZE + SIZEOF_DESCRIPTOR) * \ + (CYGNUM_DEVS_ETH_INTEL_I82559_MAX_TX_DESCRIPTORS + \ + CYGNUM_DEVS_ETH_INTEL_I82559_MAX_RX_DESCRIPTORS)) + \ + MISC_MEM) + +static char pci_mem_buffer[CYGHWR_INTEL_I82559_PCI_MEM_MAP_SIZE + HAL_DCACHE_LINE_SIZE]; + +#define CYGHWR_INTEL_I82559_PCI_MEM_MAP_BASE \ + (CYGARC_UNCACHED_ADDRESS(((unsigned)pci_mem_buffer + HAL_DCACHE_LINE_SIZE - 1) & ~(HAL_DCACHE_LINE_SIZE - 1))) + +static I82559 i82559_eth0_priv_data = { +#ifdef CYGSEM_DEVS_ETH_ARM_IQ80310_ETH0_SET_ESA + hardwired_esa: 1, + mac_address: CYGDAT_DEVS_ETH_ARM_IQ80310_ETH0_ESA +#else + hardwired_esa: 0, +#endif +}; + +ETH_DRV_SC(i82559_sc0, + &i82559_eth0_priv_data, // Driver specific data + CYGDAT_DEVS_ETH_ARM_IQ80310_ETH0_NAME, // Name for device + i82559_start, + i82559_stop, + i82559_ioctl, + i82559_can_send, + i82559_send, + i82559_recv, + i82559_deliver, + i82559_poll, + i82559_int_vector + ); + +NETDEVTAB_ENTRY(i82559_netdev0, + "i82559_" CYGDAT_DEVS_ETH_ARM_IQ80310_ETH0_NAME, + i82559_init, + &i82559_sc0); + +#endif // CYGPKG_DEVS_ETH_ARM_IQ80310_ETH0 + + +// These arrays are used for sanity checking of pointers +I82559 * +i82559_priv_array[CYGNUM_DEVS_ETH_INTEL_I82559_DEV_COUNT] = { +#ifdef CYGPKG_DEVS_ETH_ARM_IQ80310_ETH0 + &i82559_eth0_priv_data, +#endif +}; + +#ifdef CYGDBG_USE_ASSERTS +// These are only used when assertions are enabled +cyg_netdevtab_entry_t * +i82559_netdev_array[CYGNUM_DEVS_ETH_INTEL_I82559_DEV_COUNT] = { +#ifdef CYGPKG_DEVS_ETH_ARM_IQ80310_ETH0 + &i82559_netdev0, +#endif +}; + +struct eth_drv_sc * +i82559_sc_array[CYGNUM_DEVS_ETH_INTEL_I82559_DEV_COUNT] = { +#ifdef CYGPKG_DEVS_ETH_ARM_IQ80310_ETH0 + &i82559_sc0, +#endif +}; +#endif // CYGDBG_USE_ASSERTS + +// EOF devs_eth_arm_iq80310.inl diff --git a/packages/devs/eth/arm/iq80310/current/include/iq80310_info.h b/packages/devs/eth/arm/iq80310/current/include/iq80310_info.h deleted file mode 100644 --- a/packages/devs/eth/arm/iq80310/current/include/iq80310_info.h +++ /dev/null @@ -1,275 +0,0 @@ -#ifndef CYGONCE_DEVS_ETH_ARM_IQ80310_IQ80310_INFO_H -#define CYGONCE_DEVS_ETH_ARM_IQ80310_IQ80310_INFO_H -/*========================================================================== -// -// iq80310_info.h -// -// -//========================================================================== -//####COPYRIGHTBEGIN#### -// -// ------------------------------------------- -// The contents of this file are subject to the Red Hat eCos Public License -// Version 1.1 (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.redhat.com/ -// -// Software distributed under the License is distributed on an "AS IS" -// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -// License for the specific language governing rights and limitations under -// the License. -// -// The Original Code is eCos - Embedded Configurable Operating System, -// released September 30, 1998. -// -// The Initial Developer of the Original Code is Red Hat. -// Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. -// All Rights Reserved. -// ------------------------------------------- -// -//####COPYRIGHTEND#### -//========================================================================== -//#####DESCRIPTIONBEGIN#### -// -// Author(s): hmt -// Contributors: hmt -// Date: 2000-05-03 -// Description: -// -//####DESCRIPTIONEND#### -*/ - -#include - -#ifdef CYGDBG_DEVS_ETH_ARM_IQ80310_KEEP_STATISTICS -# define KEEP_STATISTICS -# define nDISPLAY_STATISTICS -# define nDISPLAY_82559_STATISTICS -#else -# define nKEEP_STATISTICS -# define nDISPLAY_STATISTICS -# define nDISPLAY_82559_STATISTICS -#endif - - -// ------------------------------------------------------------------------ -// -// STATISTICAL COUNTER STRUCTURE -// -// ------------------------------------------------------------------------ -#ifdef KEEP_STATISTICS -typedef struct { -/* 0 */ cyg_uint32 tx_good; -/* 4 */ cyg_uint32 tx_max_collisions; -/* 8 */ cyg_uint32 tx_late_collisions; -/* 12 */ cyg_uint32 tx_underrun; -/* 16 */ cyg_uint32 tx_carrier_loss; -/* 20 */ cyg_uint32 tx_deferred; -/* 24 */ cyg_uint32 tx_single_collisions; -/* 28 */ cyg_uint32 tx_mult_collisions; -/* 32 */ cyg_uint32 tx_total_collisions; -/* 36 */ cyg_uint32 rx_good; -/* 40 */ cyg_uint32 rx_crc_errors; -/* 44 */ cyg_uint32 rx_align_errors; -/* 48 */ cyg_uint32 rx_resource_errors; -/* 52 */ cyg_uint32 rx_overrun_errors; -/* 56 */ cyg_uint32 rx_collisions; // Always 0 -/* 60 */ cyg_uint32 rx_short_frames; -// In this setup; can also be flow-control counts after. -// If these are to be used, a config command (as in set promiscuous mode) -// must be issued at start, to let those stats escape. Params are in -// comments around the config command setup... -/* 64 */ cyg_uint32 done; -} I82559_COUNTERS; - - -typedef struct { - cyg_uint32 interrupts; - cyg_uint32 rx_count; - cyg_uint32 rx_deliver; - cyg_uint32 rx_resource; - cyg_uint32 rx_restart; - cyg_uint32 tx_count; - cyg_uint32 tx_complete; - cyg_uint32 tx_dropped; -} STATISTICS; - - -extern STATISTICS statistics[2]; -#ifdef CYGDBG_DEVS_ETH_ARM_IQ80310_KEEP_82559_STATISTICS -extern I82559_COUNTERS i82559_counters[2]; -#endif - -#endif // KEEP_STATISTICS - -// ------------------------------------------------------------------------ -// -// DEVICES AND PACKET QUEUES -// -// ------------------------------------------------------------------------ - - -typedef struct i82559 { - cyg_uint8 // (split up for atomic byte access) - found:1, // was hardware discovered? - mac_addr_ok:1, // can we bring up? - active:1, // has this if been brung up? - spare1:5; - cyg_uint8 - spare2:8; - cyg_uint8 - tx_in_progress:1, // transmit in progress flag - tx_queue_full:1, // all Tx descriptors used flag - spare3:6; - cyg_uint8 index; // 0 or 1 or whatever - cyg_uint32 devid; // PCI device id - cyg_uint32 memory_address; // PCI memory address - cyg_uint32 io_address; // memory mapped I/O address - cyg_uint8 mac_address[6]; // mac (hardware) address - void *ndp; // Network Device Pointer - - int next_rx_descriptor; // descriptor index for RFDs - struct rfd *rx_ring[MAX_RX_DESCRIPTORS]; // location of Rx descriptors - - int tx_descriptor_add; // descriptor index for additions - int tx_descriptor_active; // descriptor index for active tx - int tx_descriptor_remove; // descriptor index for remove - - struct txcb *tx_ring[MAX_TX_DESCRIPTORS]; // location of Tx descriptors - unsigned long tx_keys[MAX_TX_DESCRIPTORS]; - // keys for tx q management - - // Interrupt handling stuff - cyg_vector_t vector; // interrupt vector - cyg_handle_t interrupt_handle; // handle for int.handler - cyg_interrupt interrupt_object; - -#ifdef KEEP_STATISTICS - void *p_statistics; // pointer to statistical counters -#endif - -} I82559; - - - -// ------------------------------------------------------------------------ -// -// 82559 GENERAL STATUS REGISTER -// -// ------------------------------------------------------------------------ -#define GEN_STATUS_FDX 0x04 // 1 = full duplex, 0 = half -#define GEN_STATUS_100MBPS 0x02 // 1 = 100 Mbps, 0 = 10 Mbps -#define GEN_STATUS_LINK 0x01 // 1 = link up, 0 = link down - -extern int i82559_status( struct eth_drv_sc *sc ); - -// ------------------------------------------------------------------------ - -#ifdef KEEP_STATISTICS -void update_statistics(struct i82559* p_i82559); -#endif - - -#ifdef CYGDBG_DEVS_ETH_ARM_IQ80310_KEEP_82559_STATISTICS -#define ETH_STATS_INIT( p ) \ - update_statistics( (struct i82559 *)((p)->driver_private) ) -#else -#define ETH_STATS_INIT( p ) // otherwise do nothing -#endif - -#define CYGDAT_DEVS_ETH_DESCRIPTION "Intel EtherPRO 10/100+ (i82559)" - -#define ETH_DEV_DOT3STATSETHERCHIPSET 1,3,6,1,2,1,10,7,8,2,5 - -#endif /* ifndef CYGONCE_DEVS_ETH_ARM_IQ80310_IQ80310_INFO_H */ - -// ------------------------------------------------------------------------ - -// MDI definitions -#define MDI_WRITE_OP 0x01 -#define MDI_READ_OP 0x02 -#define MDI_NOT_READY 0 -#define MDI_POLLED 0 -#define MDI_DEFAULT_PHY_ADDR 1 // when only one PHY - -// PHY device register addresses - -// generic register addresses -#define MDI_PHY_CTRL 0 -#define MDI_PHY_STAT 1 -#define MDI_PHY_ID_1 2 -#define MDI_PHY_ID_2 3 -#define MDI_PHY_AUTO_AD 4 -#define MDI_PHY_AUTO_LNK 5 -#define MDI_PHY_AUTO_EXP 6 - -#define I82555_PHY_ID 0x02a80150 -#define ICS1890_PHY_ID 0x0015f420 -#define DP83840_PHY_ID 0x20005c00 -#define I82553_PHY_ID 0x02a80350 -#define I82553_REVAB_PHY_ID 0x03e00000 - -/* I82555/558 Status and Control register */ -#define I82555_STATCTRL_REG 0x10 -#define I82555_100_MBPS (1 << 1) -#define I82555_10_MBPS (0 << 1) - -#define REVISION_MASK 0xf - -/* DP83840 specific register information */ -#define DP83840_PCR_REG 0x17 -#define PCR_TXREADY_SEL (1 << 10) -#define PCR_FCONNECT (1 << 5) - -/* ICS1890 QuickPoll Detailed Status register */ -#define ICS1890_QUICKPOLL_REG 0x11 -#define QUICK_100_MBPS (1 << 15) -#define QUICK_10_MBPS (0 << 15) -#define QUICK_LINK_VALID (1 << 0) -#define QUICK_LINK_INVALID (0 << 0) - -#define DP83840_PHY_ADDR_REG 0x19 -#define PHY_ADDR_CON_STATUS (1 << 5) -#define PHY_ADDR_SPEED_10_MBPS (1 << 6) -#define PHY_ADDR_SPEED_100_MBPS (0 << 6) - -#define DP83840_LOOPBACK_REG 0x18 -#define TWISTER_LOOPBACK (0x1 << 8) -#define REMOTE_LOOPBACK (0x2 << 8) -#define CLEAR_LOOP_BITS ~(TWISTER_LOOPBACK | REMOTE_LOOPBACK) - -/* 82553 specific register information */ -#define I82553_PHY_EXT_REG0 0x10 -#define EXT_REG0_100_MBPS (1 << 1) -#define GET_REV_CNTR(n) ((n & 0x00e0) >> 5) -#define I82553_PHY_EXT_REG1 0x14 - -/* MDI Control Register bits */ -#define MDI_CTRL_COLL_TEST (1 << 7) -#define MDI_CTRL_FULL_DUPLEX (1 << 8) -#define MDI_CTRL_RESTART_AUTO (1 << 9) -#define MDI_CTRL_ISOLATE (1 << 10) -#define MDI_CTRL_POWER_DOWN (1 << 11) -#define MDI_CTRL_AUTO_ENAB (1 << 12) -#define MDI_CTRL_AUTO_DISAB (0 << 12) -#define MDI_CTRL_100_MBPS (1 << 13) -#define MDI_CTRL_10_MBPS (0 << 13) -#define MDI_CTRL_LOOPBACK (1 << 14) -#define MDI_CTRL_RESET (1 << 15) - -/* MDI Status Register bits */ -#define MDI_STAT_EXTENDED (1 << 0) -#define MDI_STAT_JABBER (1 << 1) -#define MDI_STAT_LINK (1 << 2) -#define MDI_STAT_AUTO_CAPABLE (1 << 3) -#define MDI_STAT_REMOTE_FLT (1 << 4) -#define MDI_STAT_AUTO_COMPLETE (1 << 5) -#define MDI_STAT_10BASET_HALF (1 << 11) -#define MDI_STAT_10BASET_FULL (1 << 12) -#define MDI_STAT_TX_HALF (1 << 13) -#define MDI_STAT_TX_FULL (1 << 14) -#define MDI_STAT_T4_CAPABLE (1 << 15) - -/* EOF iq80310_info.h */ - diff --git a/packages/devs/eth/arm/iq80310/current/src/if_iq80310.c b/packages/devs/eth/arm/iq80310/current/src/if_iq80310.c deleted file mode 100644 --- a/packages/devs/eth/arm/iq80310/current/src/if_iq80310.c +++ /dev/null @@ -1,3044 +0,0 @@ -//========================================================================== -// -// if_iq80310.c -// -// Ethernet drivers -// Intel IQ80310 and PRO/100+ platform specific support -// -//========================================================================== -//####COPYRIGHTBEGIN#### -// -// ------------------------------------------- -// The contents of this file are subject to the Red Hat eCos Public License -// Version 1.1 (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.redhat.com/ -// -// Software distributed under the License is distributed on an "AS IS" -// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -// License for the specific language governing rights and limitations under -// the License. -// -// The Original Code is eCos - Embedded Configurable Operating System, -// released September 30, 1998. -// -// The Initial Developer of the Original Code is Red Hat. -// Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. -// All Rights Reserved. -// ------------------------------------------- -// -//####COPYRIGHTEND#### -//####BSDCOPYRIGHTBEGIN#### -// -// ------------------------------------------- -// -// Portions of this software may have been derived from OpenBSD or other sources, -// and are covered by the appropriate copyright disclaimers included herein. -// -// ------------------------------------------- -// -//####BSDCOPYRIGHTEND#### -//========================================================================== -//#####DESCRIPTIONBEGIN#### -// -// Author(s): hmt, gthomas -// Contributors: Ron Spence, Pacific Softworks; msalter -// Date: 2000-02-01 -// Purpose: -// Description: hardware driver for 82559 Intel PRO/100+ ethernet on -// a Intel XScale IQ80310 development board -// -// -//####DESCRIPTIONEND#### -// -//========================================================================== - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CYGPKG_NET -#include -#include /* Needed for struct ifnet */ -#else -#include -#endif - -#ifdef CYGPKG_IO_PCI -#include -// So we can check the validity of the PCI window against the MLTs opinion, -// and thereby what the malloc heap consumes willy-nilly: -#include CYGHWR_MEMORY_LAYOUT_H -#else -#error "Need PCI package here" -#endif - -// Exported statistics and the like -#include -#include - -extern char cyg_io_iq80310_i82559_shmem[]; -#define CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_BASE ((cyg_addrword_t)cyg_io_iq80310_i82559_shmem) -// This must match actual size in if_shmem.S: -#define CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_SIZE \ - ((MAX_RX_PACKET_SIZE + sizeof(RFD)) * \ - (CYGNUM_DEVS_ETH_ARM_IQ80310_MAX_TX_DESCRIPTORS + \ - CYGNUM_DEVS_ETH_ARM_IQ80310_MAX_RX_DESCRIPTORS)) - - -// ------------------------------------------------------------------------ - -#ifdef CYGDBG_DEVS_ETH_ARM_IQ80310_CHATTER -#define notDEBUG_82559 // This one prints stuff as packets come and go -#define DEBUG // Startup printing mainly -#define DEBUG_EE // Some EEPROM specific retries &c -#endif - -#define os_printf diag_printf -#define db_printf diag_printf - -// ------------------------------------------------------------------------ -// I/O access macros as inlines for type safety - -static inline void OUTB(cyg_uint8 value, cyg_uint32 io_address) -{ *((volatile cyg_uint8 *)io_address) = value; } - -static inline void OUTW(cyg_uint16 value, cyg_uint32 io_address) -{ *((volatile cyg_uint16 *)io_address) = value; } - -static inline void OUTL(cyg_uint32 value, cyg_uint32 io_address) -{ *((volatile cyg_uint32 *)io_address) = value; } - -static inline cyg_uint8 INB(cyg_uint32 io_address) -{ return *((volatile cyg_uint8 *)io_address); } - -static inline cyg_uint16 INW(cyg_uint32 io_address) -{ return *((volatile cyg_uint16 *)io_address); } - -static inline cyg_uint32 INL(cyg_uint32 io_address) -{ return *((volatile cyg_uint32 *)io_address); } - -// Bus masters can get to all of SDRAM using direct mapping. -#define VIRT_TO_BUS( _x_ ) ((cyg_uint32)(_x_)) -#define BUS_TO_VIRT( _x_ ) ((cyg_uint32)(_x_)) - -// ------------------------------------------------------------------------ -// -// 82559 REGISTER OFFSETS (I/O SPACE) -// -// ------------------------------------------------------------------------ -#define SCBStatus 0 // Rx/Command Unit command and status. -#define SCBCmd 2 // Rx/Command Unit command and status. -#define SCBPointer 4 // General purpose pointer. -#define SCBPort 8 // Misc. commands and operands. -#define SCBflash 12 // Flash memory control. -#define SCBeeprom 14 // EEPROM memory control. -#define SCBCtrlMDI 16 // MDI interface control. -#define SCBEarlyRx 20 // Early receive byte count. -#define SCBGenControl 28 // 82559 General Control Register -#define SCBGenStatus 29 // 82559 General Status register - - -// ------------------------------------------------------------------------ -// -// 82559 SCB STATUS WORD DEFNITIONS -// -// ------------------------------------------------------------------------ -#define SCB_STATUS_CX 0x8000 // CU finished command (transmit) -#define SCB_STATUS_FR 0x4000 // frame received -#define SCB_STATUS_CNA 0x2000 // CU left active state -#define SCB_STATUS_RNR 0x1000 // receiver left ready state -#define SCB_STATUS_MDI 0x0800 // MDI read/write cycle done -#define SCB_STATUS_SWI 0x0400 // software generated interrupt -#define SCB_STATUS_FCP 0x0100 // flow control pause interrupt - -#define SCB_INTACK_MASK 0xFD00 // all the above - -#define SCB_INTACK_TX (SCB_STATUS_CX | SCB_STATUS_CNA) -#define SCB_INTACK_RX (SCB_STATUS_FR | SCB_STATUS_RNR) - -// ------------------------------------------------------------------------ -// -// 82559 PORT INTERFACE COMMANDS -// -// ------------------------------------------------------------------------ -#define I82559_RESET 0x00000000 // software reset -#define I82559_SELFTEST 0x00000001 // 82559 selftest command -#define I82559_SELECTIVE_RESET 0x00000002 -#define I82559_DUMP 0x00000003 -#define I82559_DUMP_WAKEUP 0x00000007 - - -// ------------------------------------------------------------------------ -// -// 82559 EEPROM INTERFACE -// -// ------------------------------------------------------------------------ -// EEPROM_Ctrl bits. -#define EE_SHIFT_CLK 0x01 // EEPROM shift clock. -#define EE_CS 0x02 // EEPROM chip select. -#define EE_DATA_WRITE 0x04 // EEPROM chip data in. -#define EE_DATA_READ 0x08 // EEPROM chip data out. -#define EE_ENB (0x4800 | EE_CS) - -// Delay between EEPROM clock transitions. -#define eeprom_delay(usec) udelay(usec); - -// The EEPROM commands include the always-set leading bit. -#define EE_WRITE_CMD(a) (5 << (a)) -#define EE_READ_CMD(a) (6 << (a)) -#define EE_ERASE_CMD(a) (7 << (a)) -#define EE_WRITE_EN_CMD(a) (19 << ((a)-2)) -#define EE_WRITE_DIS_CMD(a) (16 << ((a)-2)) -#define EE_ERASE_ALL_CMD(a) (18 << ((a)-2)) - -#define EE_TOP_CMD_BIT(a) ((a)+2) // Counts down to zero -#define EE_TOP_DATA_BIT (15) // Counts down to zero - -#define EEPROM_ENABLE_DELAY (10) // Delay at chip select - -#define EEPROM_SK_DELAY (2) // Delay between clock edges *and* data - // read or transition; 3 of these per bit. -#define EEPROM_DONE_DELAY (100) // Delay when all done - - -// ------------------------------------------------------------------------ -// -// SYSTEM CONTROL BLOCK COMMANDS -// -// ------------------------------------------------------------------------ -// CU COMMANDS -#define CU_NOP 0x0000 -#define CU_START 0x0010 -#define CU_RESUME 0x0020 -#define CU_STATSADDR 0x0040 // Load Dump Statistics ctrs addr -#define CU_SHOWSTATS 0x0050 // Dump statistics counters. -#define CU_ADDR_LOAD 0x0060 // Base address to add to CU commands -#define CU_DUMPSTATS 0x0070 // Dump then reset stats counters. - -// RUC COMMANDS -#define RUC_NOP 0x0000 -#define RUC_START 0x0001 -#define RUC_RESUME 0x0002 -#define RUC_ABORT 0x0004 -#define RUC_ADDR_LOAD 0x0006 // (seems not to clear on acceptance) -#define RUC_RESUMENR 0x0007 - -#define SCB_M 0x0100 // 0 = enable interrupt, 1 = disable -#define SCB_SI 0x0200 // 1 - cause device to interrupt - -#define CU_STATUS_MASK 0x00C0 -#define RU_STATUS_MASK 0x003C - -#define RU_STATUS_IDLE (0<<2) -#define RU_STATUS_SUS (1<<2) -#define RU_STATUS_NORES (2<<2) -#define RU_STATUS_READY (4<<2) -#define RU_STATUS_NO_RBDS_SUS ((1<<2)|(8<<2)) -#define RU_STATUS_NO_RBDS_NORES ((2<<2)|(8<<2)) -#define RU_STATUS_NO_RBDS_READY ((4<<2)|(8<<2)) - - -#define MAX_MEM_RESERVED_IOCTL 1000 - -// ------------------------------------------------------------------------ -// -// RECEIVE FRAME DESCRIPTORS -// -// ------------------------------------------------------------------------ -typedef struct rfd { - volatile union { - cyg_uint32 u32_status; // result of receive operation - cyg_uint16 u16_status[2]; - } u_status; - volatile cyg_uint32 link; // offset from RU base to next RFD - volatile cyg_uint32 rdb_address; // pointer to Rx data buffer - volatile cyg_uint32 count:14, // number of bytes received + - f:1, // + EOF & F flags - eof:1, - size:16; // size of the data buffer - volatile cyg_uint8 buffer[0]; // data buffer (simple mode) -} RFD; - -// The status is split into two shorts to get atomic access to the EL bit; -// the upper word is not written by the device, so we can just hit it, -// leaving the lower word (which the device updates) alone. Otherwise -// there's a race condition between software moving the end-of-list (EL) -// bit round and the device writing into the previous slot. - -#define rxstatus u_status.u32_status -#define rxstatus_hi u_status.u16_status[1] -#define rxstatus_lo u_status.u16_status[0] - -#define RFD_STATUS_EL 0x80000000 // 1=last RFD in RFA -#define RFD_STATUS_S 0x40000000 // 1=suspend RU after receiving frame -#define RFD_STATUS_H 0x00100000 // 1=RFD is a header RFD -#define RFD_STATUS_SF 0x00080000 // 0=simplified, 1=flexible mode -#define RFD_STATUS_C 0x00008000 // completion of received frame -#define RFD_STATUS_OK 0x00002000 // frame received with no errors - -#define RFD_STATUS_HI_EL 0x8000 // 1=last RFD in RFA -#define RFD_STATUS_HI_S 0x4000 // 1=suspend RU after receiving frame -#define RFD_STATUS_HI_H 0x0010 // 1=RFD is a header RFD -#define RFD_STATUS_HI_SF 0x0008 // 0=simplified, 1=flexible mode - -#define RFD_STATUS_LO_C 0x8000 // completion of received frame -#define RFD_STATUS_LO_OK 0x2000 // frame received with no errors - -#define RFD_RX_CRC 0x00000800 // crc error -#define RFD_RX_ALIGNMENT 0x00000400 // alignment error -#define RFD_RX_RESOURCE 0x00000200 // out of space, no resources -#define RFD_RX_DMA_OVER 0x00000100 // DMA overrun -#define RFD_RX_SHORT 0x00000080 // short frame error -#define RFD_RX_LENGTH 0x00000020 // -#define RFD_RX_ERROR 0x00000010 // receive error -#define RFD_RX_NO_ADR_MATCH 0x00000004 // no address match -#define RFD_RX_IA_MATCH 0x00000002 // individual address does not match -#define RFD_RX_TCO 0x00000001 // TCO indication - - -typedef struct rbd { - volatile cyg_uint32 count:14, // bytes used in buffer - f:1, // buffer has been used (filled) - eof:1; // last receive buffer in frame - volatile cyg_uint32 next_rbd; // next RBD (RU base relative) - volatile cyg_uint32 buffer_address; // address of receive data buffer - volatile cyg_uint32 size:15, // size of the associated buffer - el:1; // buffer of this RBD is last -} RBD; - - -// ------------------------------------------------------------------------ -// -// TRANSMIT FRAME DESCRIPTORS -// -// ------------------------------------------------------------------------ -typedef struct txcb { - volatile cyg_uint32 txstatus:16, // result of transmit operation - command:16; // transmit command - volatile cyg_uint32 link; // offset from RU base to next RFD - volatile cyg_uint32 tbd_address; // pointer to Rx data buffer - volatile cyg_uint32 count:15, // number of bytes in transmit buffer - eof:1, - tx_threshold:8, - tbd_number:8; - volatile cyg_uint8 buffer[0]; // data buffer (simple mode) -} TxCB; - - -#define TxCB_CMD_TRANSMIT 0x0004 // transmit command -#define TxCB_CMD_SF 0x0008 // 0=simplified, 1=flexible mode -#define TxCB_CMD_NC 0x0010 // 0=CRC insert by controller -#define TxCB_CMD_I 0x2000 // generate interrupt on completion -#define TxCB_CMD_S 0x4000 // suspend on completion -#define TxCB_CMD_EL 0x8000 // last command block in CBL - - -// ------------------------------------------------------------------------ -// -// STRUCTURES ADDED FOR PROMISCUOUS MODE -// -// ------------------------------------------------------------------------ -typedef struct { - cyg_uint32 cb_status_word:13, - cb_ok:1, - cb_dc:1, - cb_complete:1, - cb_cmd:3, - cb_cmd_word:10, - cb_int:1, - cb_suspend:1, - cb_el:1; - cyg_uint32 cb_link_offset; -} CB_STRUCT; - - -typedef struct { - CB_STRUCT cb_entry; - cyg_uint8 config_bytes[24]; -} CONFIG_CMD_STRUCT; - -// ------------------------------------------------------------------------ -// -// STATISTICAL COUNTER STRUCTURE -// -// ------------------------------------------------------------------------ -#ifdef KEEP_STATISTICS -STATISTICS statistics[2]; -I82559_COUNTERS i82559_counters[2]; -#endif // KEEP_STATISTICS - -// ------------------------------------------------------------------------ -// -// DEVICES AND PACKET QUEUES -// -// ------------------------------------------------------------------------ - -#define MAX_RX_PACKET_SIZE 1536 // maximum Rx packet size -#define MAX_TX_PACKET_SIZE 1536 // maximum Tx packet size - - -// This is encapsulated here so that a change to > 2 interfaces can -// easily be accommodated. - -#define IF_BAD_82559( _p_ ) \ - CYG_ASSERT( (&i82559[0] == (_p_)) || (&i82559[1] == (_p_)), \ - "Bad pointer-to-i82559" ); \ - if ( (&i82559[0] != (_p_)) && (&i82559[1] != (_p_)) ) - -// ------------------------------------------------------------------------ -// Instantiate the interfaces that we have: - -// number of interfaces -#define MAX_82559 1 - -I82559 i82559[MAX_82559]; // i82559 device info. structure - -// eth0 - -ETH_DRV_SC(iq80310_sc0, - &i82559[0], // Driver specific data - "eth0", // Name for this interface - i82559_start, - i82559_stop, - i82559_ioctl, - i82559_can_send, - i82559_send, - i82559_recv, - i82559_deliver, - i82559_poll, - i82559_int_vector - ); - -NETDEVTAB_ENTRY(iq80310_netdev0, - "iq80310-0", - iq80310_i82559_init, - &iq80310_sc0); - -#if (MAX_82559 > 1) - -// eth1 - -ETH_DRV_SC(iq80310_sc1, - &i82559[1], // Driver specific data - "eth1", // Name for this interface - i82559_start, - i82559_stop, - i82559_ioctl, - i82559_can_send, - i82559_send, - i82559_recv, - i82559_deliver, - i82559_poll, - i82559_int_vector - ); - -NETDEVTAB_ENTRY(iq80310_netdev1, - "iq80310-1", - iq80310_i82559_init, - &iq80310_sc1); - -#else -int iq80310_netdev1 = -1; // for asserts about valid addresses -int iq80310_sc1 = -1; -#endif // eth1 is included - -// This is in a macro so that if more devices arrive it can easily be changed -#define CHECK_NDP_SC_LINK() CYG_MACRO_START \ - CYG_ASSERT( ((void *)ndp == (void *)&iq80310_netdev0) || \ - ((void *)ndp == (void *)&iq80310_netdev1), "Bad ndp" ); \ - CYG_ASSERT( ((void *)sc == (void *)&iq80310_sc0) || \ - ((void *)sc == (void *)&iq80310_sc1), "Bad sc" ); \ - CYG_ASSERT( (void *)p_i82559 == sc->driver_private, "sc pointer bad" );\ -CYG_MACRO_END - -// ------------------------------------------------------------------------ -// -// Managing the memory that is windowed onto the PCI bus -// -// ------------------------------------------------------------------------ - -static cyg_uint32 i82559_heap_size; -static cyg_uint8 *i82559_heap_base; -static cyg_uint8 *i82559_heap_free; - -static void *mem_reserved_ioctl = (void*)0; -// uncacheable memory reserved for ioctl calls - -// ------------------------------------------------------------------------ -// -// FUNCTION PROTOTYPES -// -// ------------------------------------------------------------------------ - -static int pci_init_find_82559s(void); - -static void i82559_reset(struct i82559* p_i82559); - -static void InitRxRing(struct i82559* p_i82559); -static void ResetRxRing(struct i82559* p_i82559); -static void InitTxRing(struct i82559* p_i82559); -static void ResetTxRing(struct i82559* p_i82559); - -#ifdef CYGPKG_DEVS_ETH_ARM_IQ80310_WRITE_EEPROM -static void program_eeprom(cyg_uint32 , cyg_uint32 , cyg_uint8 * ); -#endif -#ifdef CYGPKG_NET -static int eth_set_promiscuous_mode(struct i82559* p_i82559); -#endif - -// debugging/logging only: -void dump_txcb(TxCB *p_txcb); -void DisplayStatistics(void); -void update_statistics(struct i82559* p_i82559); -void dump_rfd(RFD *p_rfd, int anyway ); -void dump_all_rfds( int intf ); -void dump_packet(cyg_uint8 *p_buffer, int length); - -// ------------------------------------------------------------------------ -// utilities -// ------------------------------------------------------------------------ - -static // inline -void wait_for_cmd_done(long scb_ioaddr) -{ - register int CSRstatus; - register int wait = 0x100000; - do CSRstatus = INB(scb_ioaddr + SCBCmd) ; - while( CSRstatus && --wait >= 0); - CYG_ASSERT( wait > 0, "wait_for_cmd_done" ); -} - -// Short circuit the drv_interrupt_XXX API once we are started: - -static inline int Mask82559Interrupt(struct i82559* p_i82559) -{ - int cpu_intr; - int old; - int mask = 1 << (CYGNUM_HAL_INTERRUPT_ETHERNET - CYGNUM_HAL_INTERRUPT_TIMER); - - HAL_DISABLE_INTERRUPTS( cpu_intr ); - - old = *X3MASK_REG; - *X3MASK_REG = old | mask; - - HAL_RESTORE_INTERRUPTS( cpu_intr ); - - return old & mask; -} - - -static inline void UnMask82559Interrupt(struct i82559* p_i82559, int old) -{ - int cpu_intr; - int mask = 1 << (CYGNUM_HAL_INTERRUPT_ETHERNET - CYGNUM_HAL_INTERRUPT_TIMER); - - // We must only unmask (enable) if it was unmasked before, - // according to the bit in old. - HAL_DISABLE_INTERRUPTS( cpu_intr ); - *X3MASK_REG = (*X3MASK_REG & ~mask) | old; - HAL_RESTORE_INTERRUPTS( cpu_intr ); -} - -#ifdef CYGDBG_USE_ASSERTS // an indication of a debug build -static int acknowledge82559interrupt_compensating = 0; -#endif - -static void Acknowledge82559Interrupt(struct i82559* p_i82559) -{ - int sources, mask; - cyg_uint32 ioaddr; - cyg_uint16 status; - int loops = 64; - - // XScale does nothing in interrupt_acknowledge, so we can comment - // this all out. So this routine really boils down to - // "wait for the device to stop interrupting before we unmask" - // The acknowledge call is left in place, for documentary purposes. - - cyg_drv_interrupt_acknowledge(p_i82559->vector); - - // It appears that some time can be taken before the interrupt source - // *really* quietens down... this is ugly, but effective. - // Without it, we get "Spurious Interrupt!" failures. - ioaddr = p_i82559->io_address; // get I/O address for 82559 - - mask = (1 << (CYGNUM_HAL_INTERRUPT_ETHERNET - CYGNUM_HAL_INTERRUPT_TIMER)); - sources = *X3ISR_REG; - - status = INW(ioaddr + SCBStatus); - while ( ((0 != (sources & mask)) || (0 != (status & SCB_INTACK_MASK))) - && --loops >= 0) { - OUTW( status & SCB_INTACK_MASK, ioaddr + SCBStatus); - cyg_drv_interrupt_acknowledge(p_i82559->vector); -#ifdef CYGDBG_USE_ASSERTS - acknowledge82559interrupt_compensating++; // verify this is executed -#endif - sources = *X3ISR_REG; - status = INW(ioaddr + SCBStatus); - } - CYG_ASSERT( loops >= 0, "Acknowledge82559Interrupt" ); -} - - -static void udelay(int delay) -{ - int i; - // the loop is going to take 3 ticks. At 600 MHz, to give uS, multiply - // by 600/3 = 200. No volatile is needed on i; gcc recognizes delay - // loops and does NOT elide them. - for ( i = 200 * delay; i ; i--) - ; -} - -// ------------------------------------------------------------------------ -// Memory management -// -// Simply carve off from the front of the PCI mapped window into real memory - -static void *pciwindow_mem_alloc(int size) -{ - void *p_memory; - int _size = size; - - CYG_ASSERT( - (CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_BASE <= (int)i82559_heap_free) - && - ((CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_BASE + - CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_SIZE) > (int)i82559_heap_free) - && - (0 < i82559_heap_size) - && - (CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_SIZE >= i82559_heap_size) - && - (CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_BASE == (int)i82559_heap_base), - "Heap variables corrupted" ); - - p_memory = (void *)0; - size = (size + 3) & ~3; - if ( (i82559_heap_free+size) < (i82559_heap_base+i82559_heap_size) ) { - cyg_uint32 *p; - p_memory = (void *)i82559_heap_free; - i82559_heap_free += size; - for ( p = (cyg_uint32 *)p_memory; _size > 0; _size -= 4 ) - *p++ = 0; - } - - return p_memory; -} - - - -// ------------------------------------------------------------------------ -// -// GET EEPROM SIZE -// -// ------------------------------------------------------------------------ -static int get_eeprom_size(long ioaddr) -{ - unsigned short retval = 0; - int ee_addr = ioaddr + SCBeeprom; - int i, addrbits; - - // Should already be not-selected, but anyway: - OUTW(EE_ENB & ~EE_CS, ee_addr); - eeprom_delay(EEPROM_ENABLE_DELAY); - OUTW(EE_ENB, ee_addr); - eeprom_delay(EEPROM_ENABLE_DELAY); - - // Shift the read command bits out. - for (i = 2; i >= 0; i--) { - short dataval = (6 & (1 << i)) ? EE_DATA_WRITE : 0; - OUTW(EE_ENB | dataval , ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - OUTW(EE_ENB | dataval , ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - } - // Now clock out address zero, looking for the dummy 0 data bit - for ( i = 1; i <= 12; i++ ) { - OUTW(EE_ENB , ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - OUTW(EE_ENB | EE_SHIFT_CLK, ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - OUTW(EE_ENB , ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - retval = INW(ee_addr) & EE_DATA_READ; - if ( 0 == retval ) - break; // The dummy zero est arrive' - } - -#ifdef DEBUG_EE - os_printf( "eeprom data bits %d (ioaddr %x)\n", i, ee_addr ); -#endif - if ( 6 != i && 8 != i ) { -#ifdef DEBUG_EE - os_printf( "*****EEPROM data bits not 6 or 8*****\n" ); -#endif - i = 6; - } - addrbits = i; - - // clear the dataval, leave the clock low to read in the data regardless - OUTW(EE_ENB, ee_addr); - eeprom_delay(1); - - retval = INW(ee_addr); - if ( (EE_DATA_READ & retval) != 0 ) { -#ifdef DEBUG_EE - os_printf( "Size EEPROM: Dummy data bit not 0, reg %x\n" , retval ); -#endif - } - eeprom_delay(1); - - for (i = EE_TOP_DATA_BIT; i >= 0; i--) { - OUTW(EE_ENB | EE_SHIFT_CLK, ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - retval = INW(ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - OUTW(EE_ENB, ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - } - - // Terminate the EEPROM access. - OUTW(EE_ENB & ~EE_CS, ee_addr); - eeprom_delay(EEPROM_DONE_DELAY); - - return addrbits; -} - - -// ------------------------------------------------------------------------ -// -// READ EEPROM -// -// ------------------------------------------------------------------------ -static int read_eeprom(long ioaddr, int location, int addr_len) -{ - unsigned short retval = 0; - int ee_addr = ioaddr + SCBeeprom; - int read_cmd = location | EE_READ_CMD(addr_len); - int i, tries = 10; - - try_again: - // Should already be not-selected, but anyway: - OUTW(EE_ENB & ~EE_CS, ee_addr); - eeprom_delay(EEPROM_ENABLE_DELAY); - OUTW(EE_ENB, ee_addr); - eeprom_delay(EEPROM_ENABLE_DELAY); - - // Shift the read command bits out, changing only one bit per time. - for (i = EE_TOP_CMD_BIT(addr_len); i >= 0; i--) { - short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0; - OUTW(EE_ENB | dataval , ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - OUTW(EE_ENB | dataval , ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - } - - // clear the dataval, leave the clock low - OUTW(EE_ENB, ee_addr); - eeprom_delay(1); - - retval = INW(ee_addr); - // This should show a zero in the data read bit to confirm that the - // address transfer is compelete. If not, go to the start and try - // again! - if ( (0 != (retval & EE_DATA_READ)) && (tries-- > 0) ) { - // Terminate the EEPROM access. - OUTW(EE_ENB & ~EE_CS, ee_addr); - eeprom_delay(EEPROM_DONE_DELAY); -#ifdef DEBUG_EE - os_printf( "Warning: Retrying EEPROM read word %d, address %x, try %d\n", - location, ee_addr, tries+1 ); -#endif - goto try_again; - } - - // This fires with one device on one of the customer boards! - // (but is OK on all other h/w. Worrying huh.) - if ( (EE_DATA_READ & retval) != 0 ) { -#ifdef DEBUG_EE - os_printf( "Read EEPROM: Dummy data bit not 0, reg %x\n" , retval ); -#endif - } - eeprom_delay(1); - retval = 0; - - for (i = EE_TOP_DATA_BIT; i >= 0; i--) { - OUTW(EE_ENB | EE_SHIFT_CLK, ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - retval = (retval << 1) | ((INW(ee_addr) & EE_DATA_READ) ? 1 : 0); - eeprom_delay(EEPROM_SK_DELAY); - OUTW(EE_ENB, ee_addr); - eeprom_delay(EEPROM_SK_DELAY); - } - - // Terminate the EEPROM access. - OUTW(EE_ENB & ~EE_CS, ee_addr); - eeprom_delay(EEPROM_DONE_DELAY); - - return retval; -} - -// ------------------------------------------------------------------------ -// -// MDI -// -// ------------------------------------------------------------------------ - -#define SPEED_NOLINK 0 -#define SPEED_10M 10 -#define SPEED_100M 100 - -// MDI Control Register -typedef union -{ - struct - { - cyg_uint32 data : 16; // data to write or data read - cyg_uint32 regAdd : 5; // PHY register address - cyg_uint32 phyAdd : 5; // PHY address - cyg_uint32 op : 2; // opcode, 1 for MDI write, 2 for MDI read - cyg_uint32 ready : 1; // 1 = operation complete - cyg_uint32 intEnab : 1; // 1 = interrupt at end of cycle - cyg_uint32 rsrv : 2; // reserved - } bits; - cyg_uint32 word; -} MDICTL; - -static cyg_uint16 readMDI (long ioaddr, cyg_uint8 phyAdd, cyg_uint8 regAdd) -{ - int mdi_addr = ioaddr + SCBCtrlMDI; - MDICTL mdiCtrl; - int num_ms = 0; - - // prepare for the MDI operation - mdiCtrl.bits.ready = MDI_NOT_READY; - mdiCtrl.bits.intEnab = MDI_POLLED; // no interrupts - mdiCtrl.bits.op = MDI_READ_OP; - mdiCtrl.bits.phyAdd = phyAdd & 0x1f; - mdiCtrl.bits.regAdd = regAdd & 0x1f; - - // start the operation - OUTL(mdiCtrl.word, mdi_addr); - - // delay a bit - udelay (1000); - - // poll for completion */ - mdiCtrl.word = INL(mdi_addr); - - while ((mdiCtrl.bits.ready == MDI_NOT_READY) && (num_ms != 2000)) { // wait max 2secs - mdiCtrl.word = INL(mdi_addr); - udelay(1000); - num_ms++; - } - - if (num_ms >= 2000) { - CYG_FAIL ("readMDI Timeout!\n"); - return -1; - } - else - return (cyg_uint16)mdiCtrl.bits.data; -} - - -static void writeMDI (long ioaddr, cyg_uint8 phyAdd, cyg_uint8 regAdd, cyg_uint16 data) -{ - int mdi_addr = ioaddr + SCBCtrlMDI; - register MDICTL mdiCtrl; - int num_ms = 0; - - // prepare for the MDI operation - mdiCtrl.bits.ready = MDI_NOT_READY; - mdiCtrl.bits.intEnab = MDI_POLLED; // no interrupts - mdiCtrl.bits.op = MDI_WRITE_OP; - mdiCtrl.bits.phyAdd = phyAdd & 0x1f; - mdiCtrl.bits.regAdd = regAdd & 0x1f; - mdiCtrl.bits.data = data & 0xffff; - - // start the operation - OUTL(mdiCtrl.word, mdi_addr); - - // delay a bit - udelay(1000); - - // poll for completion - mdiCtrl.word = INL(mdi_addr); - - while ((mdiCtrl.bits.ready == MDI_NOT_READY) && (num_ms != 2000)) { - mdiCtrl.word = INL(mdi_addr); - udelay(1000); - num_ms++; - } - if (num_ms >= 2000) - CYG_FAIL ("writeMDI Timeout!\n"); - - return; -} - -static int initPHY (long ioaddr, cyg_uint32 device_type) -{ - cyg_uint16 temp_reg; - cyg_uint8 revision; - - // strip off revision and phy. id information - revision = (cyg_uint8)(device_type & REVISION_MASK); - device_type &= ~REVISION_MASK; - - switch (device_type) { - case ICS1890_PHY_ID: - temp_reg = readMDI(ioaddr, MDI_DEFAULT_PHY_ADDR, MDI_PHY_CTRL); // get ready for loopback setting - writeMDI(ioaddr, MDI_DEFAULT_PHY_ADDR, MDI_PHY_CTRL, temp_reg); - break; - - case DP83840_PHY_ID: // set the Intel-specified "must set" bits - temp_reg = readMDI(ioaddr, MDI_DEFAULT_PHY_ADDR, DP83840_PCR_REG); - temp_reg |= (PCR_TXREADY_SEL | PCR_FCONNECT); - writeMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, DP83840_PCR_REG, temp_reg); - - // get ready for loopback setting - temp_reg = readMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, DP83840_LOOPBACK_REG); - temp_reg &= CLEAR_LOOP_BITS; - writeMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, DP83840_LOOPBACK_REG, temp_reg); - break; - - case I82553_PHY_ID: - case I82553_REVAB_PHY_ID: - case I82555_PHY_ID: - break; - - default: - return 1; - break; - } - - return 0; -} - - - - - -// ------------------------------------------------------------------------ -// -// NETWORK INTERFACE INITIALIZATION -// -// Function : Init82559 -// -// Description : -// This routine resets, configures, and initializes the chip. -// It also clears the ethernet statistics structure, and selects -// which statistics are supported by this driver. -// -// ------------------------------------------------------------------------ -static bool -iq80310_i82559_init(struct cyg_netdevtab_entry * ndp) -{ - static int initialized = 0; // only probe PCI et al *once* - - struct eth_drv_sc *sc; - cyg_uint32 selftest; - volatile cyg_uint32 *p_selftest; - cyg_uint32 ioaddr; - cyg_uint16 checksum; - int count; - int i, ints; - int addr_length; - cyg_uint8 mac_address[6]; - struct i82559 *p_i82559; - -#ifdef DEBUG - db_printf("iq80310_i82559_init\n"); -#endif - - sc = (struct eth_drv_sc *)(ndp->device_instance); - p_i82559 = (struct i82559 *)(sc->driver_private); - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "Bad device private pointer %x\n", sc->driver_private ); -#endif - return 0; - } - - CHECK_NDP_SC_LINK(); - - if ( 0 == initialized++ ) { - // then this is the first time ever: - if ( ! pci_init_find_82559s() ) { -#ifdef DEBUG - os_printf( "pci_init_find_82559s failed" ); -#endif - return 0; - } - } - - if ( ! p_i82559->found ) // no device on PCI bus - return (0); - - ioaddr = p_i82559->io_address; // get I/O address for 82559 - -#ifdef DEBUG - os_printf("Init82559 %d @ %x\n82559 Self Test\n", - p_i82559->index, (int)ndp); -#endif - - ints = Mask82559Interrupt(p_i82559); - - wait_for_cmd_done(ioaddr); // make sure no command operating - - i82559_reset(p_i82559); - - // Perform a system self-test. (get enough mem to round address) - if ( (selftest = (cyg_uint32)pciwindow_mem_alloc(32) ) == 0) - return (0); - p_selftest = (cyg_uint32 *) ((selftest + 15) & ~0xf); - - p_selftest[0] = p_selftest[1] = -1; - - OUTL( (VIRT_TO_BUS(p_selftest)) | I82559_SELFTEST, ioaddr + SCBPort); - count = 0x1FFFFF; // Timeout for self-test. - do { - udelay(10); - } while ( (p_selftest[1] == -1) && (--count >= 0) ); - - Acknowledge82559Interrupt(p_i82559); - UnMask82559Interrupt(p_i82559, ints ); - - if (count < 0) { - // Test timed out. -#ifdef DEBUG - os_printf("Self test failed\n"); -#endif - return (0); - } -#ifdef DEBUG - os_printf(" General self-test: %s.\n" - " serial sub-system self-test: %s.\n" - " Internal registers self-test: %s.\n" - " ROM checksum self-test: %s (%08X).\n", - p_selftest[1] & 0x1000 ? "failed" : "passed", - p_selftest[1] & 0x0020 ? "failed" : "passed", - p_selftest[1] & 0x0008 ? "failed" : "passed", - p_selftest[1] & 0x0004 ? "failed" : "passed", - p_selftest[0]); -#endif - - // read eeprom and get 82559's mac address - addr_length = get_eeprom_size(ioaddr); - // (this is the length of the *EEPROM*s address, not MAC address) - - for (checksum = 0, i = 0, count = 0; count < 64; count++) { - cyg_uint16 value; - // read word from eeprom - value = read_eeprom(ioaddr, count, addr_length); -#ifdef DEBUG_EE - // os_printf( "%2d: %04x\n", count, value ); -#endif - checksum += value; - if (count < 3) { - mac_address[i++] = value & 0xFF; - mac_address[i++] = (value >> 8) & 0xFF; - } - } - - // If the EEPROM checksum is wrong, the MAC address read from the - // EEPROM is probably wrong as well. In that case, we don't set - // mac_addr_ok, but continue the initialization. If then somebody calls - // i82559_start without calling eth_set_mac_address() first, we refuse - // to bring up the interface, because running with an invalid MAC - // address is not a very brilliant idea. - -#if 0 - if ((checksum & 0xFFFF) != 0xBABA) { - // selftest verified checksum, verify again -#ifdef DEBUG_EE - os_printf( "Warning: Invalid EEPROM checksum %04X for device %d\n", - checksum, p_i82559->index); -#endif - } else -#endif - { - p_i82559->mac_addr_ok = 1; -#ifdef DEBUG_EE - os_printf("Valid EEPROM checksum\n"); -#endif - } -#ifdef DEBUG - os_printf("MAC Address = %02X %02X %02X %02X %02X %02X\n", - mac_address[0], mac_address[1], mac_address[2], mac_address[3], - mac_address[4], mac_address[5]); -#endif - - // record the MAC address in the device structure - p_i82559->mac_address[0] = mac_address[0]; - p_i82559->mac_address[1] = mac_address[1]; - p_i82559->mac_address[2] = mac_address[2]; - p_i82559->mac_address[3] = mac_address[3]; - p_i82559->mac_address[4] = mac_address[4]; - p_i82559->mac_address[5] = mac_address[5]; - - // and record the net dev pointer - p_i82559->ndp = (void *)ndp; - - InitRxRing(p_i82559); - InitTxRing(p_i82559); - - // Initialize upper level driver - if ( p_i82559->mac_addr_ok ) - (sc->funs->eth_drv->init)(sc, &(p_i82559->mac_address[0]) ); - else - (sc->funs->eth_drv->init)(sc, 0 ); - - return (1); -} - -// ------------------------------------------------------------------------ -// -// Function : i82559_start -// -// ------------------------------------------------------------------------ -static void i82559_start( struct eth_drv_sc *sc, - unsigned char *enaddr, int flags ) -{ - struct i82559 *p_i82559; - cyg_uint32 ioaddr, phy_id; - cyg_uint16 phy_addr_reg, temp1, temp2; - int broadcom_flag = false; - int link_speed = SPEED_NOLINK; -#ifdef KEEP_STATISTICS - void *p_statistics; -#endif -#ifdef CYGPKG_NET - struct ifnet *ifp = &sc->sc_arpcom.ac_if; -#endif - - p_i82559 = (struct i82559 *)sc->driver_private; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "i82559_start: Bad device pointer %x\n", p_i82559 ); -#endif - return; - } - - if ( ! p_i82559->mac_addr_ok ) { -#ifdef DEBUG - os_printf("i82559_start %d: invalid MAC address, " - "can't bring up interface\n", - p_i82559->index ); -#endif - return; - } - - if ( p_i82559->active ) - i82559_stop( sc ); - - ioaddr = p_i82559->io_address; // get 82559's I/O address - - phy_id = readMDI(ioaddr ,MDI_DEFAULT_PHY_ADDR, MDI_PHY_ID_1) << 16; - phy_id |= readMDI(ioaddr ,MDI_DEFAULT_PHY_ADDR, MDI_PHY_ID_2); - - if ((phy_id & 0xfffffff0) == I82555_PHY_ID) { -#ifdef DEBUG - os_printf ("Intel 82555/558 PHY detected...\n"); -#endif - // dummy read for reliable status - (void)readMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, MDI_PHY_STAT); - - temp1 = readMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, MDI_PHY_STAT); - - phy_addr_reg = readMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, I82555_STATCTRL_REG); - - if (temp1 & MDI_STAT_LINK) // speed only valid with good LNK - link_speed = (phy_addr_reg & I82555_100_MBPS) ? SPEED_100M : SPEED_10M; -#ifdef DEBUG - else - os_printf ("Connect Speed is NOT VALID\n"); -#endif - } - - if ((phy_id & 0xfffffff0) == ICS1890_PHY_ID) { -#ifdef DEBUG - os_printf ("Integrated Circuit Systems ICS1890 PHY detected...\n"); - os_printf ("Revision = %c\n", 'A' + (phy_id & REVISION_MASK)); -#endif - // dummy read for reliable status - (void)readMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, ICS1890_QUICKPOLL_REG); - temp1 = readMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, ICS1890_QUICKPOLL_REG); - - if (temp1 & QUICK_LINK_VALID) // speed only valid with good LNK - link_speed = (temp1 & QUICK_100_MBPS) ? SPEED_100M : SPEED_10M; -#ifdef DEBUG - else - os_printf ("Connect Speed is NOT VALID\n"); -#endif - } - - if ((phy_id & 0xfffffff0) == DP83840_PHY_ID) { -#ifdef DEBUG - os_printf ("National DP83840 PHY detected...\n"); - os_printf ("Revision = %c\n", 'A' + (phy_id & REVISION_MASK)); -#endif - - // dummy read for reliable status - (void)readMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, MDI_PHY_STAT); - temp1 = readMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, MDI_PHY_STAT); - - phy_addr_reg = readMDI (ioaddr ,MDI_DEFAULT_PHY_ADDR, DP83840_PHY_ADDR_REG); - - if (temp1 & MDI_STAT_LINK) // speed only valid with good LNK - link_speed = (phy_addr_reg & PHY_ADDR_SPEED_10_MBPS) ? SPEED_10M : SPEED_100M; -#ifdef DEBUG - else - os_printf ("Connect Speed is NOT VALID\n"); -#endif - } - - if ((phy_id & 0xfffffff0) == I82553_PHY_ID) { -#ifdef DEBUG - os_printf ("Intel 82553 PHY detected...\n"); - os_printf ("Revision = %c\n", 'A' + (phy_id & REVISION_MASK)); -#endif - broadcom_flag = true; - } - - if (phy_id == I82553_REVAB_PHY_ID) { -#ifdef DEBUG - os_printf ("Intel 82553 PHY detected...\n"); - os_printf ("Revision = B\n"); -#endif - broadcom_flag = true; - } - - if (broadcom_flag == true) { - temp2 = readMDI (ioaddr, MDI_DEFAULT_PHY_ADDR, I82553_PHY_EXT_REG0); - - // dummy read for reliable status - (void)readMDI (ioaddr ,MDI_DEFAULT_PHY_ADDR, MDI_PHY_STAT); - temp1 = readMDI (ioaddr ,MDI_DEFAULT_PHY_ADDR, MDI_PHY_STAT); - - if (temp1 & MDI_STAT_LINK) { // speed only valid with good LNK - link_speed = (temp2 & EXT_REG0_100_MBPS) ? SPEED_100M : SPEED_10M; -#ifdef DEBUG - } else { - os_printf ("Connect Speed is NOT VALID\n"); -#endif - } - } - -#ifdef KEEP_STATISTICS -#ifdef CYGDBG_DEVS_ETH_ARM_IQ80310_KEEP_82559_STATISTICS - p_i82559->p_statistics = - p_statistics = pciwindow_mem_alloc(sizeof(I82559_COUNTERS)); - memset(p_statistics, 0xFFFFFFFF, sizeof(I82559_COUNTERS)); - wait_for_cmd_done(ioaddr); // make sure no command operating - // set statistics dump address - OUTL(VIRT_TO_BUS(p_statistics), ioaddr + SCBPointer); - OUTW(SCB_M | CU_STATSADDR, ioaddr + SCBCmd); - - wait_for_cmd_done(ioaddr); // make sure no command operating - OUTW(SCB_M | CU_DUMPSTATS, ioaddr + SCBCmd); // start register dump -#endif -#endif - - // Set the base address - wait_for_cmd_done(ioaddr); - OUTL(0, ioaddr + SCBPointer); // load ru base address = 0 - OUTW(SCB_M | RUC_ADDR_LOAD, ioaddr + SCBCmd); - udelay( 1000 ); // load pointer to Rx Ring - OUTL(VIRT_TO_BUS(p_i82559->rx_ring[0]), ioaddr + SCBPointer); - OUTW(RUC_START, ioaddr + SCBCmd); - - p_i82559->active = 1; - - initPHY(ioaddr, phy_id); - -#ifdef CYGPKG_NET - if (( 0 -#ifdef ETH_DRV_FLAGS_PROMISC_MODE - != (flags & ETH_DRV_FLAGS_PROMISC_MODE) -#endif - ) || (ifp->if_flags & IFF_PROMISC) - ) { - eth_set_promiscuous_mode(p_i82559); - } -#endif -#ifdef DEBUG - { - int status = i82559_status( sc ); - os_printf("i82559_start %d flg %x Link = %s, %s Mbps, %s Duplex\n", - p_i82559->index, - *(int *)p_i82559, - status & GEN_STATUS_LINK ? "Up" : "Down", - status & GEN_STATUS_100MBPS ? "100" : "10", - status & GEN_STATUS_FDX ? "Full" : "Half"); - } -#endif -} - -// ------------------------------------------------------------------------ -// -// Function : i82559_status -// -// ------------------------------------------------------------------------ -int i82559_status( struct eth_drv_sc *sc ) -{ - int status; - struct i82559 *p_i82559; - cyg_uint32 ioaddr; - p_i82559 = (struct i82559 *)sc->driver_private; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "i82559_status: Bad device pointer %x\n", p_i82559 ); -#endif - return 0; - } - - ioaddr = p_i82559->io_address; // get 82559's I/O address - - status = INB(ioaddr + SCBGenStatus); - - return status; -} - -// ------------------------------------------------------------------------ -// -// Function : BringDown82559 -// -// ------------------------------------------------------------------------ - -static void i82559_stop( struct eth_drv_sc *sc ) -{ - struct i82559 *p_i82559; - - p_i82559 = (struct i82559 *)sc->driver_private; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "i82559_stop: Bad device pointer %x\n", p_i82559 ); -#endif - return; - } - -#ifdef DEBUG - os_printf("i82559_stop %d flg %x\n", p_i82559->index, *(int *)p_i82559 ); -#endif - - p_i82559->active = 0; // stop people tormenting it - i82559_reset(p_i82559); // that should stop it - - ResetRxRing( p_i82559 ); - ResetTxRing( p_i82559 ); -} - - -// ------------------------------------------------------------------------ -// -// Function : InitRxRing -// -// ------------------------------------------------------------------------ -static void InitRxRing(struct i82559* p_i82559) -{ - int i; - RFD *rfd; - RFD *p_rfd = 0; -#ifdef DEBUG_82559 - os_printf("InitRxRing %d\n", p_i82559->index); -#endif - for ( i = 0; i < MAX_RX_DESCRIPTORS; i++ ) { - rfd = (RFD *)pciwindow_mem_alloc(sizeof(RFD) + MAX_RX_PACKET_SIZE); - p_i82559->rx_ring[i] = rfd; - if ( i ) - p_rfd->link = VIRT_TO_BUS(rfd); - p_rfd = (RFD *)rfd; - } - // link last RFD to first: - p_rfd->link = VIRT_TO_BUS(p_i82559->rx_ring[0]); - - ResetRxRing( p_i82559 ); -} - -// ------------------------------------------------------------------------ -// -// Function : ResetRxRing -// -// ------------------------------------------------------------------------ -static void ResetRxRing(struct i82559* p_i82559) -{ - RFD *p_rfd; - int i; -#ifdef DEBUG_82559 - os_printf("ResetRxRing %d\n", p_i82559->index); -#endif - for ( i = 0; i < MAX_RX_DESCRIPTORS; i++ ) { - p_rfd = p_i82559->rx_ring[i]; - CYG_ASSERT( (cyg_uint8 *)p_rfd >= i82559_heap_base, "rfd under" ); - CYG_ASSERT( (cyg_uint8 *)p_rfd < i82559_heap_free, "rfd over" ); - CYG_ASSERT( p_i82559->rx_ring[ - ( i ? (i-1) : (MAX_RX_DESCRIPTORS-1) ) - ]->link == VIRT_TO_BUS(p_rfd), "rfd linked list broken" ); - p_rfd->rxstatus = 0; - p_rfd->count = 0; - p_rfd->f = 0; - p_rfd->eof = 0; - p_rfd->rdb_address = 0xFFFFFFFF; - p_rfd->size = MAX_RX_PACKET_SIZE; - } - p_i82559->next_rx_descriptor = 0; - // And set an end-of-list marker in the previous one. - p_rfd->rxstatus = RFD_STATUS_EL; -} - -// ------------------------------------------------------------------------ -// -// Function : PacketRxReady (Called from delivery thread) -// -// ------------------------------------------------------------------------ -static void PacketRxReady(struct i82559* p_i82559) -{ - RFD *p_rfd; - int next_descriptor; - int length, ints; - struct cyg_netdevtab_entry *ndp; - struct eth_drv_sc *sc; - cyg_uint32 ioaddr; - cyg_uint16 status; - - ndp = (struct cyg_netdevtab_entry *)(p_i82559->ndp); - sc = (struct eth_drv_sc *)(ndp->device_instance); - - CHECK_NDP_SC_LINK(); - - ioaddr = p_i82559->io_address; - - next_descriptor = p_i82559->next_rx_descriptor; - p_rfd = p_i82559->rx_ring[next_descriptor]; - - CYG_ASSERT( (cyg_uint8 *)p_rfd >= i82559_heap_base, "rfd under" ); - CYG_ASSERT( (cyg_uint8 *)p_rfd < i82559_heap_free, "rfd over" ); - - while ( p_rfd->rxstatus & RFD_STATUS_C ) { - p_rfd->rxstatus_hi |= RFD_STATUS_HI_EL; - length = p_rfd->count; - -#ifdef DEBUG_82559 - os_printf( "Device %d (eth%d), rx descriptor %d:\n", - p_i82559->index, p_i82559->index, next_descriptor ); -// dump_rfd( p_rfd, 1 ); -#endif - - p_i82559->next_rx_descriptor = next_descriptor; - // Check for bogusly short packets; can happen in promisc mode: - // Asserted against and checked by upper layer driver. -#ifdef CYGPKG_NET - if ( length > sizeof( struct ether_header ) ) - // then it is acceptable; offer the data to the network stack -#endif - (sc->funs->eth_drv->recv)( sc, length ); - - p_rfd->count = 0; - p_rfd->f = 0; - p_rfd->eof = 0; - p_rfd->rxstatus_lo = 0; - - // The just-emptied slot is now ready for re-use and already marked EL; - // we can now remove the EL marker from the previous one. - if ( 0 == next_descriptor ) - p_rfd = p_i82559->rx_ring[ MAX_RX_DESCRIPTORS-1 ]; - else - p_rfd = p_i82559->rx_ring[ next_descriptor-1 ]; - // The previous one: check it *was* marked before clearing. - CYG_ASSERT( p_rfd->rxstatus_hi & RFD_STATUS_HI_EL, "No prev EL" ); - p_rfd->rxstatus_hi = 0; // that word is not written by the device. - -#ifdef KEEP_STATISTICS - statistics[p_i82559->index].rx_deliver++; -#endif - if (++next_descriptor >= MAX_RX_DESCRIPTORS) - next_descriptor = 0; - p_rfd = p_i82559->rx_ring[next_descriptor]; - - CYG_ASSERT( (cyg_uint8 *)p_rfd >= i82559_heap_base, "rfd under" ); - CYG_ASSERT( (cyg_uint8 *)p_rfd < i82559_heap_free, "rfd over" ); -#ifdef CYGPKG_REDBOOT - // Need to make this decision at runtime. - break; -#endif - } - - // See if the RU has gone idle (usually because of out of resource - // condition) and restart it if needs be. - ints = Mask82559Interrupt(p_i82559); - status = INW(ioaddr + SCBStatus); - if ( RU_STATUS_READY != (status & RU_STATUS_MASK) ) { - // Acknowledge the RX INT sources - OUTW( SCB_INTACK_RX, ioaddr + SCBStatus); - // (see pages 6-10 & 6-90) - -#ifdef KEEP_STATISTICS - statistics[p_i82559->index].rx_restart++; -#endif - // There's an end-of-list marker out there somewhere... - // So mop it up; it takes a little time but this is infrequent. - ResetRxRing( p_i82559 ); - next_descriptor = 0; // re-initialize next desc. - // wait for SCB command complete - wait_for_cmd_done(ioaddr); - // load pointer to Rx Ring - OUTL(VIRT_TO_BUS(p_i82559->rx_ring[0]), - ioaddr + SCBPointer); - OUTW(RUC_START, ioaddr + SCBCmd); - Acknowledge82559Interrupt(p_i82559); - } - UnMask82559Interrupt(p_i82559, ints); - - p_i82559->next_rx_descriptor = next_descriptor; -} - -// and the callback function - -static void i82559_recv( struct eth_drv_sc *sc, - struct eth_drv_sg *sg_list, int sg_len ) -{ - struct i82559 *p_i82559; - RFD *p_rfd; - int next_descriptor; - int total_len; - struct eth_drv_sg *last_sg; - volatile cyg_uint8 *from_p; - - p_i82559 = (struct i82559 *)sc->driver_private; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "i82559_recv: Bad device pointer %x\n", p_i82559 ); -#endif - return; - } - - next_descriptor = p_i82559->next_rx_descriptor; - p_rfd = p_i82559->rx_ring[next_descriptor]; - - CYG_ASSERT( (cyg_uint8 *)p_rfd >= i82559_heap_base, "rfd under" ); - CYG_ASSERT( (cyg_uint8 *)p_rfd < i82559_heap_free, "rfd over" ); - - CYG_ASSERT( p_rfd->rxstatus & RFD_STATUS_C, "No complete frame" ); - CYG_ASSERT( p_rfd->rxstatus & RFD_STATUS_EL, "No marked frame" ); - - CYG_ASSERT( p_rfd->rxstatus_lo & RFD_STATUS_LO_C, "No complete frame 2" ); - CYG_ASSERT( p_rfd->rxstatus_hi & RFD_STATUS_HI_EL, "No marked frame 2" ); - - if ( 0 == (p_rfd->rxstatus & RFD_STATUS_C) ) - return; - - total_len = p_rfd->count; - -#ifdef DEBUG_82559 - os_printf("Rx %d %x (status %x): %d sg's, %d bytes\n", - p_i82559->index, (int)p_i82559, p_rfd->rxstatus, sg_len, total_len); -#endif - - // Copy the data to the network stack - from_p = &p_rfd->buffer[0]; - - // check we have memory to copy into; we would be called even if - // caller was out of memory in order to maintain our state. - if ( 0 == sg_len || 0 == sg_list ) - return; // caller was out of mbufs - - CYG_ASSERT( 0 < sg_len, "sg_len underflow" ); - CYG_ASSERT( MAX_ETH_DRV_SG >= sg_len, "sg_len overflow" ); - - for ( last_sg = &sg_list[sg_len]; sg_list < last_sg; sg_list++ ) { - cyg_uint8 *to_p; - int l; - - to_p = (cyg_uint8 *)(sg_list->buf); - l = sg_list->len; - - CYG_ASSERT( 0 <= l, "sg length -ve" ); - - if ( 0 >= l || 0 == to_p ) - return; // caller was out of mbufs - - if ( l > total_len ) - l = total_len; - - memcpy( to_p, (unsigned char *)from_p, l ); - from_p += l; - total_len -= l; - } - - CYG_ASSERT( 0 == total_len, "total_len mismatch in rx" ); - CYG_ASSERT( last_sg == sg_list, "sg count mismatch in rx" ); - CYG_ASSERT( &p_rfd->buffer[0] < from_p, "from_p wild in rx" ); - CYG_ASSERT( &p_rfd->buffer[0] + MAX_RX_PACKET_SIZE >= from_p, - "from_p overflow in rx" ); -} - - -// ------------------------------------------------------------------------ -// -// Function : InitTxRing -// -// ------------------------------------------------------------------------ -static void InitTxRing(struct i82559* p_i82559) -{ - int i; - cyg_uint32 ioaddr; - -#ifdef DEBUG_82559 - os_printf("InitTxRing %d\n", p_i82559->index); -#endif - ioaddr = p_i82559->io_address; - for ( i = 0; i < MAX_TX_DESCRIPTORS; i++) { - p_i82559->tx_ring[i] = (TxCB *)pciwindow_mem_alloc( - sizeof(TxCB) + MAX_TX_PACKET_SIZE); - } - - ResetTxRing(p_i82559); -} - -// ------------------------------------------------------------------------ -// -// Function : ResetTxRing -// -// ------------------------------------------------------------------------ -static void ResetTxRing(struct i82559* p_i82559) -{ - int i; - cyg_uint32 ioaddr; - -#ifdef DEBUG_82559 - os_printf("ResetTxRing %d\n", p_i82559->index); -#endif - ioaddr = p_i82559->io_address; - p_i82559->tx_descriptor_add = - p_i82559->tx_descriptor_active = - p_i82559->tx_descriptor_remove = 0; - p_i82559->tx_in_progress = - p_i82559->tx_queue_full = 0; - - for ( i = 0; i < MAX_TX_DESCRIPTORS; i++) { - TxCB *p_txcb = p_i82559->tx_ring[i]; - CYG_ASSERT( (cyg_uint8 *)p_txcb >= i82559_heap_base, "txcb under" ); - CYG_ASSERT( (cyg_uint8 *)p_txcb < i82559_heap_free, "txcb over" ); - - p_txcb->txstatus = 0; - p_txcb->command = 0; - p_txcb->link = VIRT_TO_BUS((cyg_uint32)p_txcb); - p_txcb->tbd_address = 0xFFFFFFFF; - p_txcb->tbd_number = 0; - p_txcb->tx_threshold = 16; - p_txcb->eof = 1; - p_txcb->count = 0; - p_i82559->tx_keys[i] = 0; - } - - wait_for_cmd_done(ioaddr); - OUTL(0, ioaddr + SCBPointer); - OUTW(SCB_M | CU_ADDR_LOAD, ioaddr + SCBCmd); -} - -// ------------------------------------------------------------------------ -// -// Function : TxMachine (Called from FG & ISR) -// -// This steps the Tx Machine onto the next record if necessary - allowing -// for missed interrupts, and so on. -// ------------------------------------------------------------------------ - -static void TxMachine(struct i82559* p_i82559) -{ - int tx_descriptor_active; - cyg_uint32 ioaddr; - - tx_descriptor_active = p_i82559->tx_descriptor_active; - ioaddr = p_i82559->io_address; - - // See if the CU is idle when we think it isn't; this is the only place - // tx_descriptor_active is advanced. (Also recovers from a dropped intr) - if ( p_i82559->tx_in_progress ) { - cyg_uint16 status; - status = INW(ioaddr + SCBStatus); - if ( 0 == (status & CU_STATUS_MASK) ) { - // It is idle. So ack the TX interrupts - OUTW( SCB_INTACK_TX, ioaddr + SCBStatus); - // (see pages 6-10 & 6-90) - - // and step on to the next queued tx. - p_i82559->tx_in_progress = 0; - if ( ++tx_descriptor_active >= MAX_TX_DESCRIPTORS ) - tx_descriptor_active = 0; - p_i82559->tx_descriptor_active = tx_descriptor_active; - } - } - - // is the CU idle, and there a next tx to set going? - if ( ( ! p_i82559->tx_in_progress ) - && p_i82559->tx_descriptor_add != tx_descriptor_active ) { - TxCB *p_txcb; - p_txcb = p_i82559->tx_ring[tx_descriptor_active]; - CYG_ASSERT( (cyg_uint8 *)p_txcb >= i82559_heap_base, "txcb under" ); - CYG_ASSERT( (cyg_uint8 *)p_txcb < i82559_heap_free, "txcb over" ); -#ifdef DEBUG_82559 - os_printf("Tx %d %x: Starting Engines, KEY %x\n", - p_i82559->index, (int)p_i82559, key ); -#endif - // make sure no command operating - wait_for_cmd_done(ioaddr); - // start Tx operation - OUTL(VIRT_TO_BUS(p_txcb), ioaddr + SCBPointer); - OUTW(CU_START, ioaddr + SCBCmd); - p_i82559->tx_in_progress = 1; - } -} - -// ------------------------------------------------------------------------ -// -// Function : TxDone (Called from delivery thread) -// -// This returns Tx's from the Tx Machine to the stack (ie. reports -// completion) - allowing for missed interrupts, and so on. -// ------------------------------------------------------------------------ - -static void TxDone(struct i82559* p_i82559) -{ - struct cyg_netdevtab_entry *ndp; - struct eth_drv_sc *sc; - int tx_descriptor_remove = p_i82559->tx_descriptor_remove; - - ndp = (struct cyg_netdevtab_entry *)(p_i82559->ndp); - sc = (struct eth_drv_sc *)(ndp->device_instance); - - CHECK_NDP_SC_LINK(); - - // "Done" txen are from here to active, OR - // the remove one if the queue is full AND its status is nonzero: - while ( (tx_descriptor_remove != p_i82559->tx_descriptor_active) || - ( p_i82559->tx_queue_full && - (0 != p_i82559->tx_ring[ tx_descriptor_remove ]->txstatus) ) ) { - unsigned long key = p_i82559->tx_keys[ tx_descriptor_remove ]; -#ifdef DEBUG_82559 - os_printf("TxDone %d %x: KEY %x\n", - p_i82559->index, (int)p_i82559, key ); -#endif - (sc->funs->eth_drv->tx_done)( sc, key, 1 /* status */ ); - - if ( ++tx_descriptor_remove >= MAX_TX_DESCRIPTORS ) - tx_descriptor_remove = 0; - p_i82559->tx_descriptor_remove = tx_descriptor_remove; - p_i82559->tx_queue_full = 0; - } -} - - -// ------------------------------------------------------------------------ -// -// Function : i82559_can_send -// -// ------------------------------------------------------------------------ - -static int -i82559_can_send(struct eth_drv_sc *sc) -{ - struct i82559 *p_i82559; - int ints; - - p_i82559 = (struct i82559 *)sc->driver_private; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "i82559_send: Bad device pointer %x\n", p_i82559 ); -#endif - return 0; - } - - // Advance TxMachine atomically - ints = Mask82559Interrupt(p_i82559); - TxMachine(p_i82559); - Acknowledge82559Interrupt(p_i82559); // This can eat an Rx interrupt, so - PacketRxReady(p_i82559); - UnMask82559Interrupt(p_i82559,ints); - - return ! p_i82559->tx_queue_full; -} - -// ------------------------------------------------------------------------ -// -// Function : i82559_send -// -// ------------------------------------------------------------------------ - -static void -i82559_send(struct eth_drv_sc *sc, - struct eth_drv_sg *sg_list, int sg_len, int total_len, - unsigned long key) -{ - struct i82559 *p_i82559; - int tx_descriptor_add, ints; - TxCB *p_txcb; - cyg_uint32 ioaddr; - - p_i82559 = (struct i82559 *)sc->driver_private; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "i82559_send: Bad device pointer %x\n", p_i82559 ); -#endif - return; - } - -#ifdef DEBUG_82559 - os_printf("Tx %d %x: %d sg's, %d bytes, KEY %x\n", - p_i82559->index, (int)p_i82559, sg_len, total_len, key ); -#endif - - if ( ! p_i82559->active ) - return; // device inactive, no return -#ifdef KEEP_STATISTICS - statistics[p_i82559->index].tx_count++; -#endif - ioaddr = p_i82559->io_address; // get device I/O address - - if ( p_i82559->tx_queue_full ) { -#ifdef KEEP_STATISTICS - statistics[p_i82559->index].tx_dropped++; -#endif -#ifdef DEBUG_82559 - os_printf( "i82559_send: Queue full, device %x, key %x\n", - p_i82559, key ); -#endif - } - else { - struct eth_drv_sg *last_sg; - volatile cyg_uint8 *to_p; - - tx_descriptor_add = p_i82559->tx_descriptor_add; - - p_i82559->tx_keys[tx_descriptor_add] = key; - - p_txcb = p_i82559->tx_ring[tx_descriptor_add]; - - CYG_ASSERT( (cyg_uint8 *)p_txcb >= i82559_heap_base, "txcb under" ); - CYG_ASSERT( (cyg_uint8 *)p_txcb < i82559_heap_free, "txcb over" ); - - p_txcb->txstatus = 0; - p_txcb->command = TxCB_CMD_TRANSMIT | TxCB_CMD_S - | TxCB_CMD_I | TxCB_CMD_EL; - p_txcb->link = VIRT_TO_BUS((cyg_uint32)p_txcb); - p_txcb->tbd_address = 0xFFFFFFFF; - p_txcb->tbd_number = 0; - p_txcb->tx_threshold = 16; - p_txcb->eof = 1; - p_txcb->count = total_len; - - // Copy from the sglist into the txcb - to_p = &p_txcb->buffer[0]; - - CYG_ASSERT( 0 < sg_len, "sg_len underflow" ); - CYG_ASSERT( MAX_ETH_DRV_SG >= sg_len, "sg_len overflow" ); - - for ( last_sg = &sg_list[sg_len]; sg_list < last_sg; sg_list++ ) { - cyg_uint8 *from_p; - int l; - - from_p = (cyg_uint8 *)(sg_list->buf); - l = sg_list->len; - - if ( l > total_len ) - l = total_len; - - memcpy( (unsigned char *)to_p, from_p, l ); - to_p += l; - total_len -= l; - - if ( 0 > total_len ) - break; // Should exit via sg_last normally - } - - CYG_ASSERT( 0 == total_len, "length mismatch in tx" ); - CYG_ASSERT( last_sg == sg_list, "sg count mismatch in tx" ); - CYG_ASSERT( &p_txcb->buffer[0] < to_p, "to_p wild in tx" ); - CYG_ASSERT( &p_txcb->buffer[0] + MAX_TX_PACKET_SIZE >= to_p, - "to_p overflow in tx" ); - - // Next descriptor - if ( ++tx_descriptor_add >= MAX_TX_DESCRIPTORS) - tx_descriptor_add = 0; - p_i82559->tx_descriptor_add = tx_descriptor_add; - - // From this instant, interrupts can advance the world and start, - // even complete, this tx request... - - if ( p_i82559->tx_descriptor_remove == tx_descriptor_add ) - p_i82559->tx_queue_full = 1; - } - - // Try advancing the Tx Machine regardless - - // no more interrupts until started - ints = Mask82559Interrupt(p_i82559); - - // Check that either: - // tx is already active, there is other stuff queued, - // OR this tx just added is the current active one - // OR this tx just added is already complete - CYG_ASSERT( - // The machine is busy: - (p_i82559->tx_in_progress == 1) || - // or: The machine is idle and this just added is the next one - (((p_i82559->tx_descriptor_add-1) == p_i82559->tx_descriptor_active) - || ((0 == p_i82559->tx_descriptor_add) && - ((MAX_TX_DESCRIPTORS-1) == p_i82559->tx_descriptor_active))) || - // or: This tx is already complete - (p_i82559->tx_descriptor_add == p_i82559->tx_descriptor_active), - "Active/add mismatch" ); - - // Advance TxMachine atomically - TxMachine(p_i82559); - Acknowledge82559Interrupt(p_i82559); // This can eat an Rx interrupt, so - PacketRxReady(p_i82559); - UnMask82559Interrupt(p_i82559, ints); -} - -// ------------------------------------------------------------------------ -// -// Function : i82559_reset -// -// ------------------------------------------------------------------------ -static void i82559_reset(struct i82559* p_i82559) -{ - cyg_uint32 ioaddr; - int count; - - ioaddr = p_i82559->io_address; - // make sure no command operating - wait_for_cmd_done(ioaddr); - - OUTL(I82559_SELECTIVE_RESET, ioaddr + SCBPort); - - for (count = 10 ; count-- ; ) { - udelay(1000); - } - - OUTL(I82559_RESET, ioaddr + SCBPort); - - for (count = 10 ; count-- ; ) { - udelay(1000); - } -} - - -// ------------------------------------------------------------------------ -// -// INTERRUPT HANDLERS -// -// ------------------------------------------------------------------------ - -static cyg_uint32 eth_isr(cyg_vector_t vector, cyg_addrword_t data) -{ - struct i82559* p_i82559 = (struct i82559 *)data; - cyg_uint16 status; - cyg_uint32 ioaddr; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "i82559_isr: Bad device pointer %x\n", p_i82559 ); -#endif - return 0; - } - - ioaddr = p_i82559->io_address; - status = INW(ioaddr + SCBStatus); - // Acknowledge all INT sources that were active - OUTW( status & SCB_INTACK_MASK, ioaddr + SCBStatus); - // (see pages 6-10 & 6-90) - -#ifdef KEEP_STATISTICS - statistics[p_i82559->index].interrupts++; - - // receiver left ready state ? - if ( status & SCB_STATUS_RNR ) - statistics[p_i82559->index].rx_resource++; - - // frame receive interrupt ? - if ( status & SCB_STATUS_FR ) - statistics[p_i82559->index].rx_count++; - - // transmit interrupt ? - if ( status & SCB_STATUS_CX ) - statistics[p_i82559->index].tx_complete++; -#endif - - // Advance the Tx Machine regardless - TxMachine(p_i82559); - - // it should have settled down now... - Acknowledge82559Interrupt(p_i82559); - - return CYG_ISR_CALL_DSR; // schedule DSR -} - - -// ------------------------------------------------------------------------ - -static -void eth_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) -{ - struct i82559* p_i82559 = (struct i82559 *)data; - struct cyg_netdevtab_entry *ndp = - (struct cyg_netdevtab_entry *)(p_i82559->ndp); - struct eth_drv_sc *sc = (struct eth_drv_sc *)(ndp->device_instance); - - // but here, it must be a *sc: - eth_drv_dsr( vector, count, (cyg_addrword_t)sc ); -} - -// ------------------------------------------------------------------------ -// This is called from the function below (used to be uni-DSR) -static inline void -uni_deliver(struct i82559* p_i82559) -{ - // First pass any rx data up the stack - PacketRxReady(p_i82559); - - // Then scan for completed Txen and inform the stack - TxDone(p_i82559); -} - - -// ------------------------------------------------------------------------ -void i82559_deliver(struct eth_drv_sc *sc) -{ - struct i82559* p_i82559; - - p_i82559 = &i82559[0]; - if ( p_i82559->active ) - uni_deliver( p_i82559 ); -} - -// ------------------------------------------------------------------------ -// Device table entry to operate the chip in a polled mode. -// Only diddle the interface we were asked to! - -void i82559_poll(struct eth_drv_sc *sc) -{ - struct i82559 *p_i82559; - int ints; - p_i82559 = (struct i82559 *)sc->driver_private; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "i82559_poll: Bad device pointer %x\n", p_i82559 ); -#endif - return; - } - - // Do these atomically - ints = Mask82559Interrupt(p_i82559); - - // As it happens, this driver always requests the DSR to be called: - (void)eth_isr( CYGNUM_HAL_INTERRUPT_ETHERNET, (cyg_addrword_t)p_i82559 ); - - // (no harm in calling this ints-off also, when polled) - uni_deliver( p_i82559 ); - - Acknowledge82559Interrupt(p_i82559); - UnMask82559Interrupt(p_i82559, ints); -} - -// ------------------------------------------------------------------------ -// Determine interrupt vector used by a device - for attaching GDB stubs -// packet handler. -int -i82559_int_vector(struct eth_drv_sc *sc) -{ - struct i82559 *p_i82559; - p_i82559 = (struct i82559 *)sc->driver_private; - return (p_i82559->vector); -} - -#if 0 -int -i82559_int_op( struct eth_drv_sc *sc, int mask) -{ - struct i82559 *p_i82559; - p_i82559 = (struct i82559 *)sc->driver_private; - - if ( 1 == mask ) - return Mask82559Interrupt( p_i82559 ); - - if ( 0 == mask ) - UnMask82559Interrupt( p_i82559, 0x0fffffff ); // enable all - - return 0; -} -#endif - - - // form a second level small page entry -#define SL_SMPAGE_ENTRY(base,ap3,ap2,ap1,ap0,c,b) \ - ( ((base) << 12) | ((ap3) << 10) | ((ap2) << 8) | ((ap1) << 6) |\ - ((ap0) << 4) | ((c) << 3) | ((b) << 2) | 2) - -// ------------------------------------------------------------------------ -// -// Function : pci_init_find_82559s -// -// This is called exactly once at the start of time to: -// o setup some uncached memory for bus mastering -// o scan the PCI bus for objects -// o record them in the device table -// o acquire all the info needed for the driver to access them -// o instantiate interrupts for them -// o attach those interrupts appropriately -// ------------------------------------------------------------------------ -static int -pci_init_find_82559s( void ) -{ - cyg_pci_device_id devid; - cyg_pci_device dev_info; - cyg_uint16 cmd; - int device_index; - -#ifdef DEBUG - db_printf("pci_init_find_82559s()\n"); -#endif - - // allocate memory to be used in ioctls later - if (mem_reserved_ioctl != (void*)0) { -#ifdef DEBUG - db_printf("pci_init_find_82559s() called > once\n"); -#endif - return 0; - } - - // First initialize the heap in PCI window'd memory - i82559_heap_size = CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_SIZE; - i82559_heap_base = (cyg_uint8*)CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_BASE; - - // only first 1MB of board uses 4K page table - if (CYGHWR_HAL_ARM_IQ80310_PCI_MEM_MAP_BASE > (cyg_addrword_t)0xa0100000) { -#ifdef DEBUG - db_printf("Can't get shared mem\n"); -#endif - return 0; - } - - { - // page table for 1st 1M of RAM - unsigned *ram_mmutab = (unsigned *)0xA0008400; - unsigned base = ((unsigned)i82559_heap_base) / 4096; - unsigned offset = ((unsigned)i82559_heap_base - 0xa0000000) / 4096; - int i; - - for (i = 0; i < (i82559_heap_size/4096); i++) - ram_mmutab[offset+i] = SL_SMPAGE_ENTRY(base+i, 3, 3, 3, 3, 0, 0); - - HAL_DCACHE_SYNC(); - asm volatile ("mcr p15, 0, %0, c7, c10, 4;\n" // drain WB - "mcr p15, 0, %0, c8, c7, 0;\n" // flush TLBs - : : "r"(i) ); - } - - i82559_heap_free = i82559_heap_base; - - mem_reserved_ioctl = pciwindow_mem_alloc(MAX_MEM_RESERVED_IOCTL); - - cyg_pci_init(); - -#ifdef DEBUG - db_printf("Finished cyg_pci_init();\n"); -#endif - - devid = CYG_PCI_NULL_DEVID; - - for (device_index = 0; device_index < MAX_82559; device_index++) { - struct i82559 *p_i82559 = &i82559[device_index]; - p_i82559->index = device_index; - - if (cyg_pci_find_device(0x8086, 0x1209, &devid) ) { -#ifdef DEBUG - db_printf("eth%d = 82559\n", device_index); -#endif - cyg_pci_get_device_info(devid, &dev_info); - - if (cyg_pci_translate_interrupt(&dev_info, &p_i82559->vector)) { -#ifdef DEBUG - db_printf(" Wired to HAL vector %d\n", p_i82559->vector); -#endif -#ifndef CYGPKG_REDBOOT - cyg_drv_interrupt_create( - p_i82559->vector, - 0, // Priority - unused - (CYG_ADDRWORD)p_i82559, // Data item passed to ISR & DSR - eth_isr, // ISR - eth_dsr, // DSR - &p_i82559->interrupt_handle, // handle to intr obj - &p_i82559->interrupt_object ); // space for int obj - - cyg_drv_interrupt_attach(p_i82559->interrupt_handle); -#endif - - // Don't unmask the interrupt yet, that could get us into a - // race. - - } else { - p_i82559->vector=0; -#ifdef DEBUG - db_printf(" Does not generate interrupts.\n"); -#endif - } - - if (cyg_pci_configure_device(&dev_info)) { -#ifdef DEBUG - int i; - db_printf("Found device on bus %d, devfn 0x%02x:\n", - CYG_PCI_DEV_GET_BUS(devid), - CYG_PCI_DEV_GET_DEVFN(devid)); - - if (dev_info.command & CYG_PCI_CFG_COMMAND_ACTIVE) { - db_printf(" Note that board is active. Probed" - " sizes invalid.!\n"); - } - db_printf(" Vendor 0x%04x", dev_info.vendor); - db_printf("\n Device 0x%04x", dev_info.device); - db_printf("\n Command 0x%04x, Status 0x%04x\n", - dev_info.command, dev_info.status); - - db_printf(" Class/Rev 0x%08x", dev_info.class_rev); - db_printf("\n Header 0x%02x\n", dev_info.header_type); - - db_printf(" SubVendor 0x%04x, Sub ID 0x%04x\n", - dev_info.header.normal.sub_vendor, - dev_info.header.normal.sub_id); - - for(i = 0; i < CYG_PCI_MAX_BAR; i++) { - db_printf(" BAR[%d] 0x%08x /", i, dev_info.base_address[i]); - db_printf(" probed size 0x%08x / CPU addr 0x%08x\n", - dev_info.base_size[i], dev_info.base_map[i]); - } - db_printf(" eth%d configured\n", device_index); -#endif - p_i82559->found = 1; - p_i82559->active = 0; - p_i82559->devid = devid; - p_i82559->memory_address = dev_info.base_map[0]; - p_i82559->io_address = dev_info.base_map[1]; -#ifdef DEBUG - db_printf(" memory address = 0x%08x\n", dev_info.base_map[0]); - db_printf(" I/O address = 0x%08x\n", dev_info.base_map[1]); -#endif - - // Don't use cyg_pci_set_device_info since it clears - // some of the fields we want to print out below. - cyg_pci_read_config_uint16(dev_info.devid, CYG_PCI_CFG_COMMAND, &cmd); - cmd |= CYG_PCI_CFG_COMMAND_IO // enable I/O space - | CYG_PCI_CFG_COMMAND_MEMORY // enable memory space - | CYG_PCI_CFG_COMMAND_MASTER; // enable bus master - cyg_pci_write_config_uint16(dev_info.devid, CYG_PCI_CFG_COMMAND, cmd); - - // Now the PCI part of the device is configured, reset it. This - // should make it safe to enable the interrupt - i82559_reset(p_i82559); - - if (p_i82559->vector != 0) { - cyg_drv_interrupt_acknowledge(p_i82559->vector); -#ifndef CYGPKG_REDBOOT - cyg_drv_interrupt_unmask(p_i82559->vector); -#endif - } -#ifdef DEBUG - db_printf(" **** Device enabled for I/O and Memory and Bus Master\n"); -#endif - } - else { - p_i82559->found = 0; - p_i82559->active = 0; -#ifdef DEBUG - db_printf("Failed to configure device %d\n",device_index); -#endif - } - } - else { - p_i82559->found = 0; - p_i82559->active = 0; -#ifdef DEBUG - db_printf("eth%d not found\n", device_index); -#endif - } - } - - // Now a delay to ensure the hardware has "come up" before you try to - // use it. Yes, really, the full 2 seconds. It's only really - // necessary if DEBUG is off - otherwise all that printout wastes - // enough time. No kidding. - udelay( 2000000 ); - return 1; -} - -#ifdef CYGPKG_NET -// ------------------------------------------------------------------------ -// -// Function : eth_set_promiscuous_mode -// -// Return : 0 = It worked. -// non0 = It failed. -// ------------------------------------------------------------------------ - -static int eth_set_promiscuous_mode(struct i82559* p_i82559) -{ - cyg_uint32 ioaddr; - volatile CONFIG_CMD_STRUCT *ccs; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "eth_set_promiscuos_mode: Bad device pointer %x\n", - p_i82559 ); -#endif - return -1; - } - - ioaddr = p_i82559->io_address; - wait_for_cmd_done(ioaddr); - // load cu base address = 0 */ - OUTL(0, ioaddr + SCBPointer); - // 32 bit linear addressing used - - OUTW(SCB_M | CU_ADDR_LOAD, ioaddr + SCBCmd); - // wait for SCB command complete - wait_for_cmd_done(ioaddr); - - ccs = (CONFIG_CMD_STRUCT *)mem_reserved_ioctl; - - // Check the malloc we did earlier worked - if (ccs == (void*)0) - return 2; // Failed - - ccs->cb_entry.cb_cmd=0x2; - ccs->cb_entry.cb_cmd_word=0x0; - ccs->cb_entry.cb_status_word=0x0; - ccs->cb_entry.cb_int=0; - ccs->cb_entry.cb_suspend=1; - ccs->cb_entry.cb_el=1; - ccs->cb_entry.cb_complete=0; - ccs->cb_entry.cb_link_offset=VIRT_TO_BUS((cyg_uint32)&ccs); - - // Default values from the Intel Manual - ccs->config_bytes[0]=0x13; - ccs->config_bytes[1]=0x8; - ccs->config_bytes[2]=0x0; - ccs->config_bytes[3]=0x0; - ccs->config_bytes[4]=0x0; - ccs->config_bytes[5]=0x0; - ccs->config_bytes[6]=0xb2; // (promisc ? 0x80 : 0) | 0x32 for small stats, - ccs->config_bytes[7]=0x0; // \ ditto | 0x12 for stats with PAUSE stats - ccs->config_bytes[8]=0x0; // \ ditto | 0x16 for PAUSE + TCO stats - ccs->config_bytes[9]=0x0; - ccs->config_bytes[10]=0x28; - ccs->config_bytes[11]=0x0; - ccs->config_bytes[12]=0x60; - ccs->config_bytes[13]=0x0; // arp - ccs->config_bytes[14]=0x0; // arp - - ccs->config_bytes[15]=0x81; // promiscuous mode set - // \ or 0x80 for normal mode. - ccs->config_bytes[16]=0x0; - ccs->config_bytes[17]=0x40; - ccs->config_bytes[18]=0x72; // Keep the Padding Enable bit - - // wait for SCB command complete - wait_for_cmd_done(ioaddr); - - OUTL(VIRT_TO_BUS(ccs), ioaddr + SCBPointer); - OUTW(SCB_M | CU_START, ioaddr + SCBCmd); - - udelay(10000); - - // now check for result ... - wait_for_cmd_done(ioaddr); - - if ( (!ccs->cb_entry.cb_ok) || (!ccs->cb_entry.cb_complete) ) - return 1; // Failed - - wait_for_cmd_done(ioaddr); - /* load pointer to Rx Ring */ - - OUTL(VIRT_TO_BUS(p_i82559->rx_ring[0]), - ioaddr + SCBPointer); - OUTW(RUC_START, ioaddr + SCBCmd); - - return 0; // OK -} -#endif - -// ------------------------------------------------------------------------ -// We use this as a templete when writing a new MAC address into the -// eeproms. The MAC address in the first few bytes is over written -// with the correct MAC address and then the whole lot is programmed -// into the serial EEPROM. The checksum is calculated on the fly and -// sent instead of the last two bytes. -// The values are copied from the Intel EtherPro10/100+ &c devices -// in the EBSA boards. - -#ifdef CYGPKG_DEVS_ETH_ARM_IQ80310_WRITE_EEPROM - -#define ee00 0x00, 0x00 // shorthand - -static char eeprom_burn[126] = { -/* halfword addresses! */ -/* 0: */ 0x00, 0x90, 0x27, 0x8c, 0x57, 0x82, 0x03, 0x02, -/* 4: */ ee00 , 0x01, 0x02, 0x01, 0x47, ee00 , -/* 8: */ 0x13, 0x72, 0x06, 0x83, 0xa2, 0x40, 0x0c, 0x00, -/* C: */ 0x86, 0x80, ee00 , ee00 , ee00 , -/* 10: */ ee00 , ee00 , ee00 , ee00 , -/* 14: */ ee00 , ee00 , ee00 , ee00 , -/* 18: */ ee00 , ee00 , ee00 , ee00 , -/* 1C: */ ee00 , ee00 , ee00 , ee00 , -/* 20: */ ee00 , ee00 , ee00 , ee00 , -/* 24: */ ee00 , ee00 , ee00 , ee00 , -/* 28: */ ee00 , ee00 , ee00 , ee00 , -/* 2C: */ ee00 , ee00 , ee00 , ee00 , -/* 30: */ 0x28, 0x01, ee00 , ee00 , ee00 , -/* 34: */ ee00 , ee00 , ee00 , ee00 , -/* 38: */ ee00 , ee00 , ee00 , ee00 , -/* 3C: */ ee00 , ee00 , ee00 -}; -#undef ee00 - -#endif - -// ------------------------------------------------------------------------ -// -// Function : eth_set_mac_address -// -// Return : 0 = It worked. -// non0 = It failed. -// ------------------------------------------------------------------------ -static int eth_set_mac_address(struct i82559* p_i82559, char *addr) -{ -#ifdef CYGPKG_DEVS_ETH_ARM_IQ80310_WRITE_EEPROM - int checksum, i, count; - // (this is the length of the *EEPROM*s address, not MAC address) - int addr_length; -#endif - cyg_uint32 ioaddr; - volatile CONFIG_CMD_STRUCT *ccs; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "eth_set_mac_address : Bad device pointer %x\n", - p_i82559 ); -#endif - return -1; - } - - ioaddr = p_i82559->io_address; - - wait_for_cmd_done(ioaddr); - - ccs = (CONFIG_CMD_STRUCT *)mem_reserved_ioctl; - if (ccs == (void*)0) - return 2; - - ccs->cb_entry.cb_cmd=0x1; - ccs->cb_entry.cb_cmd_word=0x0; - ccs->cb_entry.cb_status_word=0x0; - ccs->cb_entry.cb_int=0; - ccs->cb_entry.cb_suspend=1; - ccs->cb_entry.cb_el=1; - - memcpy((char *)(ccs->config_bytes),addr,6); - - ccs->config_bytes[6]=0x0; - ccs->config_bytes[7]=0x0; - - ioaddr = p_i82559->io_address; - - OUTL(VIRT_TO_BUS(ccs), ioaddr + SCBPointer); - OUTW(SCB_M | CU_START, ioaddr + SCBCmd); - // Next delay seems to be required, otherwise, - // cb_ok/cb_complete won't be set later. - - udelay(1000); - wait_for_cmd_done(ioaddr); - - // now check for result ... - if ( (!ccs->cb_entry.cb_ok) || (!ccs->cb_entry.cb_complete) ) - return 3; - -#ifdef CYGPKG_DEVS_ETH_ARM_IQ80310_WRITE_EEPROM - - addr_length = get_eeprom_size( ioaddr ); - - // now set this address in the device eeprom .... - (void)memcpy(eeprom_burn,addr,6); - - // No idea what these were for... - // eeprom_burn[20] &= 0xfe; - // eeprom_burn[20] |= p_i82559->index; - - program_eeprom( ioaddr, addr_length, eeprom_burn ); - - // update 82559 driver data structure ... - udelay( 100000 ); - - // by reading EEPROM to get the mac address back - for (checksum = 0, i = 0, count = 0; count < 64; count++) { - cyg_uint16 value; - // read word from eeprom - value = read_eeprom(ioaddr, count, addr_length); - checksum += value; - if (count < 3) { - p_i82559->mac_address[i++] = value & 0xFF; - p_i82559->mac_address[i++] = (value >> 8) & 0xFF; - } - } - -#ifdef DEBUG - os_printf("MAC Address = %02X %02X %02X %02X %02X %02X\n", - p_i82559->mac_address[0], p_i82559->mac_address[1], - p_i82559->mac_address[2], p_i82559->mac_address[3], - p_i82559->mac_address[4], p_i82559->mac_address[5]); -#endif - - p_i82559->mac_addr_ok = 1; - - for ( i = 0, count = 0; i < 6; i++ ) - if ( p_i82559->mac_address[i] != addr[i] ) - count++; - - if ( count ) { -#ifdef DEBUG - os_printf( "Warning: MAC Address read back wrong! %d bytes differ.\n", - count ); -#endif - p_i82559->mac_addr_ok = 0; - } - - // If the EEPROM checksum is wrong, the MAC address read from the - // EEPROM is probably wrong as well. In that case, we don't set - // mac_addr_ok. - if ((checksum & 0xFFFF) != 0xBABA) { -#ifdef DEBUG - os_printf( "Warning: Invalid EEPROM checksum %04X for device %d\n", - checksum, p_i82559->index); -#endif - p_i82559->mac_addr_ok = 0; - } -#else - p_i82559->mac_addr_ok = 1; -#endif // ! CYGPKG_DEVS_ETH_ARM_IQ80310_WRITE_EEPROM - - return p_i82559->mac_addr_ok ? 0 : 1; -} - -#ifdef CYGPKG_DEVS_ETH_ARM_IQ80310_WRITE_EEPROM -// ------------------------------------------------------------------------ -static void -write_eeprom(long ioaddr, int location, int addr_len, unsigned short value) -{ - int ee_addr = ioaddr + SCBeeprom; - int write_cmd = location | EE_WRITE_CMD(addr_len); - int i; - - OUTW(EE_ENB & ~EE_CS, ee_addr); - eeprom_delay( 100 ); - OUTW(EE_ENB, ee_addr); - eeprom_delay( 100 ); - -// os_printf("\n write_eeprom : write_cmd : %x",write_cmd); -// os_printf("\n addr_len : %x value : %x ",addr_len,value); - - /* Shift the write command bits out. */ - for (i = (addr_len+2); i >= 0; i--) { - short dataval = (write_cmd & (1 << i)) ? EE_DATA_WRITE : 0; - OUTW(EE_ENB | dataval, ee_addr); - eeprom_delay(100); - OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); - eeprom_delay(150); - } - OUTW(EE_ENB, ee_addr); - - for (i = 15; i >= 0; i--) { - short dataval = (value & (1 << i)) ? EE_DATA_WRITE : 0; - OUTW(EE_ENB | dataval, ee_addr); - eeprom_delay(100); - OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); - eeprom_delay(150); - } - - /* Terminate the EEPROM access. */ - OUTW(EE_ENB & ~EE_CS, ee_addr); - eeprom_delay(150000); // let the write take effect -} - -// ------------------------------------------------------------------------ -static int write_enable_eeprom(long ioaddr, int addr_len) -{ - int ee_addr = ioaddr + SCBeeprom; - int write_en_cmd = EE_WRITE_EN_CMD(addr_len); - int i; - - OUTW(EE_ENB & ~EE_CS, ee_addr); - OUTW(EE_ENB, ee_addr); - -#ifdef DEBUG_82559 - os_printf("write_en_cmd : %x",write_en_cmd); -#endif - - // Shift the wr/er enable command bits out. - for (i = (addr_len+2); i >= 0; i--) { - short dataval = (write_en_cmd & (1 << i)) ? EE_DATA_WRITE : 0; - OUTW(EE_ENB | dataval, ee_addr); - eeprom_delay(100); - OUTW(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); - eeprom_delay(150); - } - - // Terminate the EEPROM access. - OUTW(EE_ENB & ~EE_CS, ee_addr); - eeprom_delay(EEPROM_DONE_DELAY); -} - - -// ------------------------------------------------------------------------ -static void -program_eeprom(cyg_uint32 ioaddr, cyg_uint32 eeprom_size, cyg_uint8 *data) -{ - cyg_uint32 i; - cyg_uint16 checksum = 0; - cyg_uint16 value; - - // First enable erase/write operations on the eeprom. - // This is done through the EWEN instruction. - write_enable_eeprom( ioaddr, eeprom_size ); - - for (i=0 ; i< 63 ; i++) { - value = ((unsigned short *)data)[i]; - checksum += value; -#ifdef DEBUG_82559 - os_printf("\n i : %x ... value to be written : %x",i,value); -#endif - write_eeprom( ioaddr, i, eeprom_size, value); -#ifdef DEBUG_82559 - os_printf("\n val read : %x ",read_eeprom(ioaddr,i,eeprom_size)); -#endif - } - value = 0xBABA - checksum; -#ifdef DEBUG_82559 - os_printf("\n i : %x ... checksum adjustment val to be written : %x",i,value); -#endif - write_eeprom( ioaddr, i, eeprom_size, value ); -} - -// ------------------------------------------------------------------------ -#endif // ! CYGPKG_DEVS_ETH_ARM_IQ80310_WRITE_EEPROM - - -// ------------------------------------------------------------------------ -// -// Function : eth_get_mac_address -// -// ------------------------------------------------------------------------ -#ifdef ETH_DRV_GET_MAC_ADDRESS -static int eth_get_mac_address(struct i82559* p_i82559, char *addr) -{ - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "eth_get_mac_address : Bad device pointer %x\n", - p_i82559 ); -#endif - return -1; - } - - memcpy( addr, (char *)(&p_i82559->mac_address[0]), 6 ); - return 0; -} -#endif -// ------------------------------------------------------------------------ -// -// Function : i82559_ioctl -// -// ------------------------------------------------------------------------ -static int i82559_ioctl(struct eth_drv_sc *sc, unsigned long key, - void *data, int data_length) -{ - struct i82559 *p_i82559; - - p_i82559 = (struct i82559 *)sc->driver_private; - - IF_BAD_82559( p_i82559 ) { -#ifdef DEBUG - os_printf( "i82559_ioctl/control: Bad device pointer %x\n", p_i82559 ); -#endif - return -1; - } - -#ifdef DEBUG - db_printf( "i82559_ioctl: device eth%d at %x; key is 0x%x, data at %x[%d]\n", - p_i82559->index, p_i82559, key, data, data_length ); -#endif - - switch ( key ) { - -#ifdef ETH_DRV_SET_MAC_ADDRESS - case ETH_DRV_SET_MAC_ADDRESS: - if ( 6 != data_length ) - return -2; - return eth_set_mac_address( p_i82559, data ); -#endif - -#ifdef ETH_DRV_GET_MAC_ADDRESS - case ETH_DRV_GET_MAC_ADDRESS: - return eth_get_mac_address( p_i82559, data ); -#endif - -#ifdef ETH_DRV_GET_IF_STATS_UD - case ETH_DRV_GET_IF_STATS_UD: // UD == UPDATE - ETH_STATS_INIT( sc ); // so UPDATE the statistics structure -#endif - // drop through -#ifdef ETH_DRV_GET_IF_STATS - case ETH_DRV_GET_IF_STATS: -#endif -#if defined(ETH_DRV_GET_IF_STATS) || defined (ETH_DRV_GET_IF_STATS_UD) - { - struct ether_drv_stats *p = (struct ether_drv_stats *)data; - int i; - static unsigned char my_chipset[] - = { ETH_DEV_DOT3STATSETHERCHIPSET }; - - strcpy( p->description, CYGDAT_DEVS_ETH_DESCRIPTION ); - CYG_ASSERT( 48 > strlen(p->description), "Description too long" ); - - for ( i = 0; i < SNMP_CHIPSET_LEN; i++ ) - if ( 0 == (p->snmp_chipset[i] = my_chipset[i]) ) - break; - - i = i82559_status( sc ); - - if ( !( i & GEN_STATUS_LINK) ) { - p->operational = 2; // LINK DOWN - p->duplex = 1; // UNKNOWN - p->speed = 0; - } - else { - p->operational = 3; // LINK UP - p->duplex = (i & GEN_STATUS_FDX) ? 3 : 2; // 2 = SIMPLEX, 3 = DUPLEX - p->speed = ((i & GEN_STATUS_100MBPS) ? 100 : 10) * 1000000; - } - -#ifdef KEEP_STATISTICS - { - I82559_COUNTERS *pc = &i82559_counters[ p_i82559->index ]; - STATISTICS *ps = &statistics[ p_i82559->index ]; - - // Admit to it... - p->supports_dot3 = true; - - // Those commented out are not available on this chip. - - p->tx_good = pc->tx_good ; - p->tx_max_collisions = pc->tx_max_collisions ; - p->tx_late_collisions = pc->tx_late_collisions ; - p->tx_underrun = pc->tx_underrun ; - p->tx_carrier_loss = pc->tx_carrier_loss ; - p->tx_deferred = pc->tx_deferred ; - //p->tx_sqetesterrors = pc->tx_sqetesterrors ; - p->tx_single_collisions = pc->tx_single_collisions; - p->tx_mult_collisions = pc->tx_mult_collisions ; - p->tx_total_collisions = pc->tx_total_collisions ; - p->rx_good = pc->rx_good ; - p->rx_crc_errors = pc->rx_crc_errors ; - p->rx_align_errors = pc->rx_align_errors ; - p->rx_resource_errors = pc->rx_resource_errors ; - p->rx_overrun_errors = pc->rx_overrun_errors ; - p->rx_collisions = pc->rx_collisions ; - p->rx_short_frames = pc->rx_short_frames ; - //p->rx_too_long_frames = pc->rx_too_long_frames ; - //p->rx_symbol_errors = pc->rx_symbol_errors ; - - p->interrupts = ps->interrupts ; - p->rx_count = ps->rx_count ; - p->rx_deliver = ps->rx_deliver ; - p->rx_resource = ps->rx_resource ; - p->rx_restart = ps->rx_restart ; - p->tx_count = ps->tx_count ; - p->tx_complete = ps->tx_complete ; - p->tx_dropped = ps->tx_dropped ; - } -#endif // KEEP_STATISTICS - - p->tx_queue_len = MAX_TX_DESCRIPTORS; - - return 0; // OK - } -#endif - - default: - break; - } - return -1; -} - -// ------------------------------------------------------------------------ -// -// Statistics update... -// -// ------------------------------------------------------------------------ - -#ifdef KEEP_STATISTICS -#ifdef CYGDBG_DEVS_ETH_ARM_IQ80310_KEEP_82559_STATISTICS -void update_statistics(struct i82559* p_i82559) -{ - I82559_COUNTERS *p_statistics; - cyg_uint32 *p_counter; - cyg_uint32 *p_register; - int reg_count, ints; - - ints = Mask82559Interrupt(p_i82559); - - // This points to the sthared memory stats area/command block - p_statistics = (I82559_COUNTERS *)(p_i82559->p_statistics); - - if ( (p_statistics->done & 0xFFFF) == 0xA007 ) { - p_counter = (cyg_uint32 *)&i82559_counters[ p_i82559->index ]; - p_register = (cyg_uint32 *)p_statistics; - for ( reg_count = 0; - reg_count < sizeof( I82559_COUNTERS ) / sizeof( cyg_uint32 ) - 1; - reg_count++ ) { - *p_counter += *p_register; - p_counter++; - p_register++; - } - p_statistics->done = 0; - // make sure no command operating - wait_for_cmd_done(p_i82559->io_address); - // start register dump - OUTW(CU_DUMPSTATS, p_i82559->io_address + SCBCmd); - } - Acknowledge82559Interrupt(p_i82559); // This can eat an Rx interrupt, so - PacketRxReady(p_i82559); - - UnMask82559Interrupt(p_i82559, ints); -} -#endif -#endif // KEEP_STATISTICS - -// ------------------------------------------------------------------------ -// -// -// CODE FOR DEBUGGING PURPOSES ONLY -// -// -// ------------------------------------------------------------------------ -void dump_txcb(TxCB *p_txcb) -{ - os_printf("TxCB @ %x\n", (int)p_txcb); - os_printf("status = %04X ", p_txcb->txstatus); - os_printf("command = %04X ", p_txcb->command); - os_printf("link = %08X ", p_txcb->link); - os_printf("tbd = %08X ", p_txcb->tbd_address); - os_printf("count = %d ", p_txcb->count); - os_printf("eof = %x ", p_txcb->eof); - os_printf("threshold = %d ", p_txcb->tx_threshold); - os_printf("tbd number = %d\n", p_txcb->tbd_number); -} - -// This is intended to be the body of a THREAD that prints stuff every 10 -// seconds or so: -#ifdef KEEP_STATISTICS -#ifdef DISPLAY_STATISTICS -void DisplayStatistics(void) -{ - int i; - I82559_COUNTERS *p_statistics; - cyg_uint32 *p_counter; - cyg_uint32 *p_register; - int reg_count; - int status; - - while ( 1 ) { -#ifdef DISPLAY_82559_STATISTICS - for ( i = 0; i < 2; i ++ ) { - p_statistics = (I82559_COUNTERS *)i82559[i].p_statistics; - if ( (p_statistics->done & 0xFFFF) == 0xA007 ) { - p_counter = (cyg_uint32 *)&i82559_counters[i]; - p_register = (cyg_uint32 *)&p_statistics->tx_good; - for ( reg_count = 20; reg_count != 0; reg_count--) { - *p_counter += *p_register; - p_counter++; - p_register++; - } - p_statistics->done = 0; - // make sure no command operating - wait_for_cmd_done(i82559[i].io_address); - // start register dump - OUTW(CU_DUMPSTATS, i82559[i].io_address + SCBCmd); - } - } -#endif - os_printf("\nRx\nPackets = %d %d\n", - statistics[0].rx_count, statistics[1].rx_count); - os_printf("Deliver %d %d\n", - statistics[0].rx_deliver, statistics[1].rx_deliver); - os_printf("Resource %d %d\n", - statistics[0].rx_resource, statistics[1].rx_resource); - os_printf("Restart %d %d\n", - statistics[0].rx_restart, statistics[1].rx_restart); - -#ifdef DISPLAY_82559_STATISTICS - os_printf("Count %d %d\n", - i82559_counters[0].rx_good, i82559_counters[1].rx_good); - os_printf("CRC %d %d\n", - i82559_counters[0].rx_crc_errors, i82559_counters[1].rx_crc_errors); - os_printf("Align %d %d\n", - i82559_counters[0].rx_align_errors, i82559_counters[1].rx_align_errors); - os_printf("Resource %d %d\n", - i82559_counters[0].rx_resource_errors, i82559_counters[1].rx_resource_errors); - os_printf("Overrun %d %d\n", - i82559_counters[0].rx_overrun_errors, i82559_counters[1].rx_overrun_errors); - os_printf("Collision %d %d\n", - i82559_counters[0].rx_collisions, i82559_counters[1].rx_collisions); - os_printf("Short %d %d\n", - i82559_counters[0].rx_short_frames, i82559_counters[1].rx_short_frames); -#endif - os_printf("\nTx\nPackets = %d %d\n", - statistics[0].tx_count, statistics[1].tx_count); - os_printf("Complete %d %d\n", - statistics[0].tx_complete, statistics[1].tx_complete); - os_printf("Dropped %d %d\n", - statistics[0].tx_dropped, statistics[1].tx_dropped); - os_printf("Count %d %d\n", - i82559_counters[0].tx_good, i82559_counters[1].tx_good); -#ifdef DISPLAY_82559_STATISTICS - os_printf("Collision %d %d\n", - i82559_counters[0].tx_max_collisions,i82559_counters[1].tx_max_collisions); - os_printf("Late Col. %d %d\n", - i82559_counters[0].tx_late_collisions,i82559_counters[1].tx_late_collisions); - os_printf("Underrun %d %d\n", - i82559_counters[0].tx_underrun,i82559_counters[1].tx_underrun); - os_printf("Carrier %d %d\n", - i82559_counters[0].tx_carrier_loss,i82559_counters[1].tx_carrier_loss); - os_printf("Deferred %d %d\n", - i82559_counters[0].tx_deferred, i82559_counters[1].tx_deferred); - os_printf("1 Col %d %d\n", - i82559_counters[0].tx_single_collisions, i82559_counters[0].tx_single_collisions); - os_printf("Mult. Col %d %d\n", - i82559_counters[0].tx_mult_collisions, i82559_counters[0].tx_mult_collisions); - os_printf("Total Col %d %d\n", - i82559_counters[0].tx_total_collisions, i82559_counters[0].tx_total_collisions); -#endif - status = INB(i82559[0].io_address + SCBGenStatus); - os_printf("Interface 0 Link = %s, %s Mbps, %s Duplex\n", - status & GEN_STATUS_LINK ? "Up" : "Down", - status & GEN_STATUS_100MBPS ? "100" : "10", - status & GEN_STATUS_FDX ? "Full" : "Half"); - - status = INB(i82559[1].io_address + SCBGenStatus); - os_printf("Interface 1 Link = %s, %s Mbps, %s Duplex\n", - status & GEN_STATUS_LINK ? "Up" : "Down", - status & GEN_STATUS_100MBPS ? "100" : "10", - status & GEN_STATUS_FDX ? "Full" : "Half"); - - cyg_thread_delay(1000); - } -} -#endif // DISPLAY_STATISTICS -#endif // KEEP_STATISTICS - -void dump_rfd(RFD *p_rfd, int anyway ) -{ - if ( (0 != p_rfd->rxstatus) || anyway ) { - os_printf("RFD @ %x = ", (int)p_rfd); - os_printf("status = %x ", p_rfd->rxstatus); - os_printf("link = %x ", p_rfd->link); -// os_printf("rdb_address = %x ", p_rfd->rdb_address); - os_printf("count = %x ", p_rfd->count); - os_printf("f = %x ", p_rfd->f); - os_printf("eof = %x ", p_rfd->eof); - os_printf("size = %x\n", p_rfd->size); - os_printf("[%04x %04x %04x] ", - *((cyg_uint16 *)(&(p_rfd->buffer[0]))), - *((cyg_uint16 *)(&(p_rfd->buffer[2]))), - *((cyg_uint16 *)(&(p_rfd->buffer[4]))) ); - os_printf("[%04x %04x %04x] %04x : ", - *((cyg_uint16 *)(&(p_rfd->buffer[6]))), - *((cyg_uint16 *)(&(p_rfd->buffer[8]))), - *((cyg_uint16 *)(&(p_rfd->buffer[10]))), - *((cyg_uint16 *)(&(p_rfd->buffer[12]))) ); - os_printf("(%04x %04x %04x %04x) ", - *((cyg_uint16 *)(&(p_rfd->buffer[14]))), - *((cyg_uint16 *)(&(p_rfd->buffer[16]))), - *((cyg_uint16 *)(&(p_rfd->buffer[18]))), - *((cyg_uint16 *)(&(p_rfd->buffer[20]))) ); - os_printf("[%04x %04x %04x] ", - *((cyg_uint16 *)(&(p_rfd->buffer[22]))), - *((cyg_uint16 *)(&(p_rfd->buffer[24]))), - *((cyg_uint16 *)(&(p_rfd->buffer[26]))) ); - os_printf("%d.%d.%d.%d ", - *((cyg_uint8 *)(&(p_rfd->buffer[28]))), - *((cyg_uint8 *)(&(p_rfd->buffer[29]))), - *((cyg_uint8 *)(&(p_rfd->buffer[30]))), - *((cyg_uint8 *)(&(p_rfd->buffer[31]))) ); - os_printf("[%04x %04x %04x] ", - *((cyg_uint16 *)(&(p_rfd->buffer[32]))), - *((cyg_uint16 *)(&(p_rfd->buffer[34]))), - *((cyg_uint16 *)(&(p_rfd->buffer[36]))) ); - os_printf("%d.%d.%d.%d ...\n", - *((cyg_uint8 *)(&(p_rfd->buffer[38]))), - *((cyg_uint8 *)(&(p_rfd->buffer[39]))), - *((cyg_uint8 *)(&(p_rfd->buffer[40]))), - *((cyg_uint8 *)(&(p_rfd->buffer[41]))) ); - } -} - -void dump_all_rfds( int intf ) -{ - struct i82559* p_i82559 = &i82559[intf]; - int i, j; - j = p_i82559->next_rx_descriptor; - os_printf("rx descriptors for interface %d (eth%d):\n", intf, intf ); - for ( i = 0; i < MAX_RX_DESCRIPTORS; i++ ) - dump_rfd( p_i82559->rx_ring[i], (i > (j-3) && (i <= j)) ); - os_printf("next rx descriptor = %x\n\n", j); -} - - -void dump_packet(cyg_uint8 *p_buffer, int length) -{ - int count; - - count = 0; - while ( length > 0 ) { - if ( count == 0 ) - os_printf("\n"); - count = (count + 1) & 0x0F; - os_printf("%02X ", *p_buffer++); - length--; - } - os_printf("\n"); -} - -// ------------------------------------------------------------------------ - -// EOF if_iq80310.c diff --git a/packages/devs/eth/arm/iq80310/current/src/if_shmem.S b/packages/devs/eth/arm/iq80310/current/src/if_shmem.S deleted file mode 100644 --- a/packages/devs/eth/arm/iq80310/current/src/if_shmem.S +++ /dev/null @@ -1,59 +0,0 @@ -// #======================================================================== -// # -// # if_shmem.S -// # -// # Declare a chunk of 4Kbyte aligned memory for use by bus-mastering -// # PCI ethernet device. -// # -// #======================================================================== -// ####COPYRIGHTBEGIN#### -// -// ------------------------------------------- -// The contents of this file are subject to the Red Hat eCos Public License -// Version 1.1 (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.redhat.com/ -// -// Software distributed under the License is distributed on an "AS IS" -// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -// License for the specific language governing rights and limitations under -// the License. -// -// The Original Code is eCos - Embedded Configurable Operating System, -// released September 30, 1998. -// -// The Initial Developer of the Original Code is Red Hat. -// Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. -// All Rights Reserved. -// ------------------------------------------- -// -// ####COPYRIGHTEND#### -// #======================================================================== -// ######DESCRIPTIONBEGIN#### -// # -// # Author(s): msalter -// # Contributors: msalter -// # Date: 2000-11-03 -// # Purpose: -// # Description: This file defines a chunk of aligned memory for use -// # by bus-mastering PCI ethernet device. -// # -// #####DESCRIPTIONEND#### -// # -// #======================================================================== - -#include - -#define MAX_PACKET_SIZE 1536 -#define SIZEOF_DESCRIPTOR 16 - - .bss - .p2align(12) - .globl cyg_io_iq80310_i82559_shmem -cyg_io_iq80310_i82559_shmem: - .rept ((MAX_PACKET_SIZE + SIZEOF_DESCRIPTOR) * \ - (CYGNUM_DEVS_ETH_ARM_IQ80310_MAX_TX_DESCRIPTORS + \ - CYGNUM_DEVS_ETH_ARM_IQ80310_MAX_RX_DESCRIPTORS)) - .byte 0 - .endr diff --git a/packages/devs/eth/intel/i82559/current/ChangeLog b/packages/devs/eth/intel/i82559/current/ChangeLog --- a/packages/devs/eth/intel/i82559/current/ChangeLog +++ b/packages/devs/eth/intel/i82559/current/ChangeLog @@ -1,3 +1,12 @@ +2002-01-03 Mark Salter + + * src/if_i82559.c (pci_init_find_82559s): Remove check that + assumes driver owns entire PCI window. + + * cdl/intel_i82559_eth_drivers.cdl: Add + CYGNUM_DEVS_ETH_INTEL_I82559_MAX_TX_DESCRIPTORS and + CYGNUM_DEVS_ETH_INTEL_I82559_MAX_RX_DESCRIPTORS. + 2001-11-19 Hugo Tyson 2001-11-19 Anssi Pulkkinen diff --git a/packages/devs/eth/intel/i82559/current/cdl/intel_i82559_eth_drivers.cdl b/packages/devs/eth/intel/i82559/current/cdl/intel_i82559_eth_drivers.cdl --- a/packages/devs/eth/intel/i82559/current/cdl/intel_i82559_eth_drivers.cdl +++ b/packages/devs/eth/intel/i82559/current/cdl/intel_i82559_eth_drivers.cdl @@ -119,6 +119,40 @@ cdl_package CYGPKG_DEVS_ETH_INTEL_I82559 carefully chosen decision, hence this option." } + cdl_option CYGNUM_DEVS_ETH_INTEL_I82559_MAX_RX_DESCRIPTORS { + display "Maximum number of RX descriptors" + flavor data + default_value { CYGPKG_REDBOOT ? 4 : 128 } + define MAX_RX_DESCRIPTORS + description " + An RX descriptor is used for each ethernet frame required + to be passed to the upper networking layers. This option + sets the maximum number of these. Higher numbers use more + memory, lower numbers will reduce performance. The system + appears to work OK with as few as 8 descriptors but limps + painfully with only 4. Performance is better with more than + 8, but assuming the size of non-cached (so useless for anything + else) memory window is 1Mb, we might as well use it all. + 128 RX and TX descriptors uses the whole 1Mb, near enough." + } + + cdl_option CYGNUM_DEVS_ETH_INTEL_I82559_MAX_TX_DESCRIPTORS { + display "Maximum number of TX descriptors" + flavor data + default_value { CYGPKG_REDBOOT ? 4 : 128 } + define MAX_TX_DESCRIPTORS + description " + A TX descriptor is used for each ethernet frame passed down + from upper networking layers for transmission. This option + sets the maximum number of these. Higher numbers use more + memory, lower numbers will reduce performance. The system + appears to work OK with as few as 8 descriptors but limps + painfully with only 4. Performance is better with more than + 8, but assuming the size of non-cached (so useless for anything + else) memory window is 1Mb, we might as well use it all. + 128 RX and TX descriptors uses the whole 1Mb, near enough." + } + cdl_component CYGPKG_DEVS_ETH_INTEL_I82559_OPTIONS { display "Intel 82559 ethernet driver build options" flavor none diff --git a/packages/devs/eth/intel/i82559/current/src/if_i82559.c b/packages/devs/eth/intel/i82559/current/src/if_i82559.c --- a/packages/devs/eth/intel/i82559/current/src/if_i82559.c +++ b/packages/devs/eth/intel/i82559/current/src/if_i82559.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -2700,25 +2700,6 @@ pci_init_find_82559s( void ) CYGHWR_INTEL_I82559_PCI_MEM_MAP_BASE, "PCI window configured does not match PCI memory section base" ); #endif - CYG_ASSERT( CYGMEM_SECTION_pci_window_SIZE == - CYGHWR_INTEL_I82559_PCI_MEM_MAP_SIZE, - "PCI window configured does not match PCI memory section size" ); - - if ( -#ifdef CYGARC_UNCACHED_ADDRESS - CYGARC_UNCACHED_ADDRESS((CYG_ADDRWORD)CYGMEM_SECTION_pci_window) != -#else - (CYG_ADDRWORD)CYGMEM_SECTION_pci_window != -#endif - CYGHWR_INTEL_I82559_PCI_MEM_MAP_BASE - || - CYGMEM_SECTION_pci_window_SIZE != - CYGHWR_INTEL_I82559_PCI_MEM_MAP_SIZE ) { -#ifdef DEBUG - db_printf("pci_init_find_82559s(): PCI window misconfigured\n"); -#endif - return 0; - } // First initialize the heap in PCI window'd memory i82559_heap_size = CYGHWR_INTEL_I82559_PCI_MEM_MAP_SIZE; diff --git a/packages/devs/flash/amd/am29xxxxx/current/ChangeLog b/packages/devs/flash/amd/am29xxxxx/current/ChangeLog --- a/packages/devs/flash/amd/am29xxxxx/current/ChangeLog +++ b/packages/devs/flash/amd/am29xxxxx/current/ChangeLog @@ -1,3 +1,12 @@ +2002-01-03 Jonathan Larmour +2001-12-20 Koichi Nagashima + + * cdl/flash_amd_am29xxxxx.cdl: Add support for Toshiba TC58FVB800 part. + * include/flash_am29xxxxx_parts.inl: Ditto. + + * include/flash_am29xxxxx.inl: Fix FLASH_Reset definition. + Check sector erase timer correctly. + 2001-10-31 Jesper Skov * include/flash_am29xxxxx_parts.inl: Removed fix me comments - diff --git a/packages/devs/flash/amd/am29xxxxx/current/cdl/flash_amd_am29xxxxx.cdl b/packages/devs/flash/amd/am29xxxxx/current/cdl/flash_amd_am29xxxxx.cdl --- a/packages/devs/flash/amd/am29xxxxx/current/cdl/flash_amd_am29xxxxx.cdl +++ b/packages/devs/flash/amd/am29xxxxx/current/cdl/flash_amd_am29xxxxx.cdl @@ -32,7 +32,7 @@ ######DESCRIPTIONBEGIN#### # # Author(s): gthomas -# Contributors: gthomas, jskov +# Contributors: gthomas, jskov, Koichi Nagashima # Date: 2001-02-20 # #####DESCRIPTIONEND#### @@ -116,4 +116,13 @@ cdl_package CYGPKG_DEVS_FLASH_AMD_AM29XX able to recognize and handle the AM29LV800 part in the family." } + + cdl_option CYGHWR_DEVS_FLASH_AMD_TC58FVB800 { + display "Toshiba TC58FVB800 flash memory support" + default_value 0 + implements CYGINT_DEVS_FLASH_AMD_VARIANTS + description " + When this option is enabled, the AMD flash driver will be + able to recognize and handle the Toshiba TC58FVB800." + } } diff --git a/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx.inl b/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx.inl --- a/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx.inl +++ b/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx.inl @@ -34,7 +34,7 @@ //#####DESCRIPTIONBEGIN#### // // Author(s): gthomas -// Contributors: gthomas, jskov +// Contributors: gthomas, jskov, Koichi Nagashima // Date: 2001-02-21 // Purpose: // Description: AMD AM29xxxxx series flash device driver @@ -67,7 +67,7 @@ // Common device details. #define FLASH_Read_ID FLASHWORD( 0x90 ) #define FLASH_WP_State FLASHWORD( 0x90 ) -#define FLASH_Reset FLASHWORD( 0xFF ) +#define FLASH_Reset FLASHWORD( 0xF0 ) #define FLASH_Program FLASHWORD( 0xA0 ) #define FLASH_Block_Erase FLASHWORD( 0x30 ) @@ -314,7 +314,8 @@ flash_erase_block(void* block, unsigned timeout = 10000000; // how many retries? while (true) { state = *b_v; - if ((state & FLASH_Sector_Erase_Timer) == 0) break; + if ((state & FLASH_Sector_Erase_Timer) + == FLASH_Sector_Erase_Timer) break; if (--timeout == 0) { res = FLASH_ERR_DRV_TIMEOUT; diff --git a/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx_parts.inl b/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx_parts.inl --- a/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx_parts.inl +++ b/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx_parts.inl @@ -34,7 +34,7 @@ //#####DESCRIPTIONBEGIN#### // // Author(s): jskov -// Contributors: jskov +// Contributors: jskov, Koichi Nagashima // Date: 2001-06-08 // Purpose: // Description: AMD AM29xxxxx part descriptors @@ -208,6 +208,24 @@ banked : false }, #endif +#ifdef CYGHWR_DEVS_FLASH_AMD_TC58FVB800 + { // Toshiba TC58FVB800 (compatible with AM29LV800-B except for IDs.) + device_id : FLASHWORD(0xCE), + block_size : 0x10000 * CYGNUM_FLASH_INTERLEAVE, + block_count: 16, + device_size: 0x100000 * CYGNUM_FLASH_INTERLEAVE, + base_mask : ~(0x100000 * CYGNUM_FLASH_INTERLEAVE - 1), + bootblock : true, + bootblocks : { 0x000000 * CYGNUM_FLASH_INTERLEAVE, + 0x004000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x008000 * CYGNUM_FLASH_INTERLEAVE, + 0 + }, + banked : false + }, +#endif #else // 16 bit devices @@ -361,7 +379,6 @@ banked : false }, #endif - #ifdef CYGHWR_DEVS_FLASH_AMD_AM29LV640 { // MBM29LV640xx device_id : FLASHWORD(0x22d7), @@ -373,6 +390,24 @@ banked : false }, #endif +#ifdef CYGHWR_DEVS_FLASH_AMD_TC58FVB800 + { // Toshiba TC58FVB800 (compatible with AM29LV800-B except for IDs.) + device_id : FLASHWORD(0xCE), + block_size : 0x10000 * CYGNUM_FLASH_INTERLEAVE, + block_count: 16, + device_size: 0x100000 * CYGNUM_FLASH_INTERLEAVE, + base_mask : ~(0x100000 * CYGNUM_FLASH_INTERLEAVE - 1), + bootblock : true, + bootblocks : { 0x000000 * CYGNUM_FLASH_INTERLEAVE, + 0x004000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x002000 * CYGNUM_FLASH_INTERLEAVE, + 0x008000 * CYGNUM_FLASH_INTERLEAVE, + 0 + }, + banked : false + }, +#endif #endif // 16 bit devices diff --git a/packages/devs/flash/sh/cq7750/current/ChangeLog b/packages/devs/flash/sh/cq7750/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/devs/flash/sh/cq7750/current/ChangeLog @@ -0,0 +1,29 @@ +2001-12-20 Koichi Nagashima + + * Cloned from EDK7708 flash package. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (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.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//=========================================================================== diff --git a/packages/devs/flash/sh/cq7750/current/cdl/flash_cq7750.cdl b/packages/devs/flash/sh/cq7750/current/cdl/flash_cq7750.cdl new file mode 100644 --- /dev/null +++ b/packages/devs/flash/sh/cq7750/current/cdl/flash_cq7750.cdl @@ -0,0 +1,63 @@ +# ==================================================================== +# +# flash_cq7750.cdl +# +# FLASH memory - Hardware support on CqREEK SH7750 board +# +# ==================================================================== +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (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.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): Koichi Nagashima +# Contributors: Koichi Nagashima +# Date: 2001-12-20 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_DEVS_FLASH_CQ7750 { + display "CqREEK SH7750 board FLASH memory support" + description "FLASH memory device support for CqREEK SH7750 board" + + parent CYGPKG_IO_FLASH + active_if CYGPKG_IO_FLASH + requires CYGPKG_HAL_SH_SH7750_CQ7750 + + compile cq7750_flash.c + + # Arguably this should do in the generic package + # but then there is a logic loop so you can never enable it. + cdl_interface CYGINT_DEVS_FLASH_AMD_AM29XXXXX_REQUIRED { + display "Generic AMD AM29LV800B driver required" + } + + implements CYGINT_DEVS_FLASH_AMD_AM29XXXXX_REQUIRED + requires CYGHWR_DEVS_FLASH_AMD_TC58FVB800 + # requires CYGHWR_DEVS_FLASH_AMD_AM29LV800 +} + +# EOF flash_cq7750.cdl diff --git a/packages/devs/flash/sh/cq7750/current/src/cq7750_flash.c b/packages/devs/flash/sh/cq7750/current/src/cq7750_flash.c new file mode 100644 --- /dev/null +++ b/packages/devs/flash/sh/cq7750/current/src/cq7750_flash.c @@ -0,0 +1,57 @@ +//========================================================================== +// +// cq7750_flash.c +// +// Flash programming for Atmel device on Hitachi CQ7750 board +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (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.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): Koichi Nagashima +// Contributors: Koichi Nagashima +// Date: 2001-12-20 +// Purpose: +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + + +// A Toshiba TC58FVB800FT-85 is equipped with the CQ7750 platform. + +#define CYGNUM_FLASH_INTERLEAVE (1) +#define CYGNUM_FLASH_SERIES (1) +#define CYGNUM_FLASH_WIDTH (16) +#define CYGNUM_FLASH_BASE (0x80000000u) +// #define CYGHWR_FLASH_AM29XXXXX_NO_WRITE_PROTECT + +#include "cyg/io/flash_am29xxxxx.inl" + + +// ------------------------------------------------------------------------ +// EOF cq7750_flash.c diff --git a/packages/ecos.db b/packages/ecos.db --- a/packages/ecos.db +++ b/packages/ecos.db @@ -173,6 +173,16 @@ package CYGPKG_DEVS_FLASH_SH_EDK7708 { on the Hitachi EDK7708 platform." } +package CYGPKG_DEVS_FLASH_CQ7750 { + alias { "Support for flash memory on CqREEK SH7750 board" flash_cq7750 } + directory devs/flash/sh/cq7750 + script flash_cq7750.cdl + hardware + description " + This package contains hardware support for flash memory + on the CqREEK SH7750 platform." +} + package CYGPKG_DEVS_FLASH_MIPS_OCELOT { alias { "Support for flash memory on PMC-Sierra/Ocelot board" flash_qed_ocelot } directory devs/flash/mips/ocelot @@ -996,7 +1006,7 @@ library loader." } package CYGPKG_COMPRESS_ZLIB { - alias { "Zlib compress/decompress" zlib_compress compress_zlib } + alias { "Zlib compress/decompress" zlib_compress compress_zlib zlib } directory services/compress/zlib script compress_zlib.cdl description " @@ -2135,13 +2145,14 @@ target sa1100mm { target iq80310 { alias { "Intel IQ80310 XScale board" iq80310 } - packages { CYGPKG_HAL_ARM + packages { CYGPKG_HAL_ARM CYGPKG_HAL_ARM_IQ80310 CYGPKG_IO_PCI - CYGPKG_DEVS_ETH_ARM_IQ80310 + CYGPKG_DEVS_ETH_INTEL_I82559 + CYGPKG_DEVS_ETH_ARM_IQ80310 CYGPKG_IO_SERIAL_GENERIC_16X5X - CYGPKG_IO_SERIAL_ARM_IQ80310 - CYGPKG_DEVS_FLASH_IQ80310 + CYGPKG_IO_SERIAL_ARM_IQ80310 + CYGPKG_DEVS_FLASH_IQ80310 } description " The iq80310 target provides the packages needed to run @@ -2209,6 +2220,8 @@ target cq7750 { packages { CYGPKG_HAL_SH CYGPKG_HAL_SH_SH4 CYGPKG_HAL_SH_SH7750_CQ7750 + CYGPKG_DEVS_FLASH_CQ7750 + CYGPKG_DEVS_FLASH_AMD_AM29XXXXX CYGPKG_IO_SERIAL_SH_SCIF } description " The sh7750 target provides the packages needed to run diff --git a/packages/hal/arm/iq80310/current/ChangeLog b/packages/hal/arm/iq80310/current/ChangeLog --- a/packages/hal/arm/iq80310/current/ChangeLog +++ b/packages/hal/arm/iq80310/current/ChangeLog @@ -1,3 +1,16 @@ +2002-01-03 Mark Salter + + * misc/redboot_ROM.ecm: Use generic i82559 package. + * misc/redboot_ROMA.ecm: Ditto. + * misc/redboot_RAM.ecm: Ditto. + * misc/redboot_RAMA.ecm: Ditto. + + * include/plf_io.h (CYGARC_UNCACHED_ADDRESS): New macro to return + uncached alias for a cached address. + (CYGARC_VIRT_TO_BUS): Macro to convert virtual to physical addresses. + * include/hal_platform_setup.h: Add uncached alias for first 128M of + SDRAM. + 2001-10-03 Jonathan Larmour * src/diag/io_utils.c: Switch to diag_printf from printf. diff --git a/packages/hal/arm/iq80310/current/include/hal_platform_setup.h b/packages/hal/arm/iq80310/current/include/hal_platform_setup.h --- a/packages/hal/arm/iq80310/current/include/hal_platform_setup.h +++ b/packages/hal/arm/iq80310/current/include/hal_platform_setup.h @@ -219,12 +219,22 @@ .set __base,__base+1 // Invalid - .rept 0xF00 - 0xD01 + .rept 0xE00 - 0xD01 .word 0 .set __base,__base+1 .endr + // Uncached and unbuffered alias for first 256MB of SDRAM. This + // area can be used by device drivers for DMA operations. Buffers + // should be cache aligned. + .set __base,0xA00 + .rept 0xF00 - 0xE00 + FL_SECTION_ENTRY __base,0,3,0,0,0,0 + .set __base,__base+1 + .endr + // only I/O at 0xFE8xxxxx + .set __base,0xF00 .rept 0x1000 - 0xF00 FL_SECTION_ENTRY __base,0,3,0,0,0,0 .set __base,__base+1 diff --git a/packages/hal/arm/iq80310/current/include/plf_io.h b/packages/hal/arm/iq80310/current/include/plf_io.h --- a/packages/hal/arm/iq80310/current/include/plf_io.h +++ b/packages/hal/arm/iq80310/current/include/plf_io.h @@ -26,7 +26,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -196,6 +196,13 @@ externC void cyg_hal_plf_pci_init(void); } \ CYG_MACRO_END +// Some of SDRAM is aliased as uncached memory for drivers. +#define CYGARC_UNCACHED_ADDRESS(_x_) \ + (((((unsigned long)(_x_)) >> 28)==0xA) ? (((unsigned long)(_x_))|0x40000000) : (_x_)) +#define CYGARC_VIRT_TO_BUS(_x_) \ + (((((unsigned long)(_x_)) >> 28)==0xA) ? (_x_) : (((unsigned long)(_x_))&~0x40000000)) + + //----------------------------------------------------------------------------- // end of plf_io.h #endif // CYGONCE_PLF_IO_H diff --git a/packages/hal/arm/iq80310/current/misc/redboot_RAM.ecm b/packages/hal/arm/iq80310/current/misc/redboot_RAM.ecm --- a/packages/hal/arm/iq80310/current/misc/redboot_RAM.ecm +++ b/packages/hal/arm/iq80310/current/misc/redboot_RAM.ecm @@ -14,6 +14,7 @@ cdl_configuration eCos { package -hardware CYGPKG_HAL_ARM current ; package -hardware CYGPKG_HAL_ARM_IQ80310 current ; package -hardware CYGPKG_IO_PCI current ; + package -hardware CYGPKG_DEVS_ETH_INTEL_I82559 current ; package -hardware CYGPKG_DEVS_ETH_ARM_IQ80310 current ; package -hardware CYGPKG_IO_SERIAL_ARM_IQ80310 current ; package -hardware CYGPKG_DEVS_FLASH_IQ80310 current ; @@ -28,14 +29,6 @@ cdl_option CYGBLD_BUILD_GDB_STUBS { user_value 0 }; -cdl_option CYGDBG_DEVS_ETH_ARM_IQ80310_CHATTER { - user_value 0 -}; - -cdl_option CYGNUM_DEVS_ETH_ARM_IQ80310_DEV_COUNT { - user_value 1 -}; - cdl_option CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT { user_value 0 }; diff --git a/packages/hal/arm/iq80310/current/misc/redboot_RAMA.ecm b/packages/hal/arm/iq80310/current/misc/redboot_RAMA.ecm --- a/packages/hal/arm/iq80310/current/misc/redboot_RAMA.ecm +++ b/packages/hal/arm/iq80310/current/misc/redboot_RAMA.ecm @@ -14,6 +14,7 @@ cdl_configuration eCos { package -hardware CYGPKG_HAL_ARM current ; package -hardware CYGPKG_HAL_ARM_IQ80310 current ; package -hardware CYGPKG_IO_PCI current ; + package -hardware CYGPKG_DEVS_ETH_INTEL_I82559 current ; package -hardware CYGPKG_DEVS_ETH_ARM_IQ80310 current ; package -hardware CYGPKG_IO_SERIAL_ARM_IQ80310 current ; package -hardware CYGPKG_DEVS_FLASH_IQ80310 current ; @@ -28,14 +29,6 @@ cdl_option CYGBLD_BUILD_GDB_STUBS { user_value 0 }; -cdl_option CYGDBG_DEVS_ETH_ARM_IQ80310_CHATTER { - user_value 0 -}; - -cdl_option CYGNUM_DEVS_ETH_ARM_IQ80310_DEV_COUNT { - user_value 1 -}; - cdl_option CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT { user_value 0 }; diff --git a/packages/hal/arm/iq80310/current/misc/redboot_ROM.ecm b/packages/hal/arm/iq80310/current/misc/redboot_ROM.ecm --- a/packages/hal/arm/iq80310/current/misc/redboot_ROM.ecm +++ b/packages/hal/arm/iq80310/current/misc/redboot_ROM.ecm @@ -14,28 +14,21 @@ cdl_configuration eCos { package -hardware CYGPKG_HAL_ARM current ; package -hardware CYGPKG_HAL_ARM_IQ80310 current ; package -hardware CYGPKG_IO_PCI current ; + package -hardware CYGPKG_DEVS_ETH_INTEL_I82559 current ; package -hardware CYGPKG_DEVS_ETH_ARM_IQ80310 current ; package -hardware CYGPKG_IO_SERIAL_ARM_IQ80310 current ; + package -hardware CYGPKG_DEVS_FLASH_IQ80310 current ; package -template CYGPKG_HAL current ; package -template CYGPKG_INFRA current ; package -template CYGPKG_REDBOOT current ; package CYGPKG_IO_FLASH current ; package CYGPKG_IO_ETH_DRIVERS current ; - package CYGPKG_DEVS_FLASH_IQ80310 current ; }; cdl_option CYGBLD_BUILD_GDB_STUBS { user_value 0 }; -cdl_option CYGDBG_DEVS_ETH_ARM_IQ80310_CHATTER { - user_value 0 -}; - -cdl_option CYGNUM_DEVS_ETH_ARM_IQ80310_DEV_COUNT { - user_value 1 -}; - cdl_option CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT { user_value 0 }; diff --git a/packages/hal/arm/iq80310/current/misc/redboot_ROMA.ecm b/packages/hal/arm/iq80310/current/misc/redboot_ROMA.ecm --- a/packages/hal/arm/iq80310/current/misc/redboot_ROMA.ecm +++ b/packages/hal/arm/iq80310/current/misc/redboot_ROMA.ecm @@ -14,28 +14,21 @@ cdl_configuration eCos { package -hardware CYGPKG_HAL_ARM current ; package -hardware CYGPKG_HAL_ARM_IQ80310 current ; package -hardware CYGPKG_IO_PCI current ; + package -hardware CYGPKG_DEVS_ETH_INTEL_I82559 current ; package -hardware CYGPKG_DEVS_ETH_ARM_IQ80310 current ; package -hardware CYGPKG_IO_SERIAL_ARM_IQ80310 current ; + package -hardware CYGPKG_DEVS_FLASH_IQ80310 current ; package -template CYGPKG_HAL current ; package -template CYGPKG_INFRA current ; package -template CYGPKG_REDBOOT current ; package CYGPKG_IO_FLASH current ; package CYGPKG_IO_ETH_DRIVERS current ; - package CYGPKG_DEVS_FLASH_IQ80310 current ; }; cdl_option CYGBLD_BUILD_GDB_STUBS { user_value 0 }; -cdl_option CYGDBG_DEVS_ETH_ARM_IQ80310_CHATTER { - user_value 0 -}; - -cdl_option CYGNUM_DEVS_ETH_ARM_IQ80310_DEV_COUNT { - user_value 1 -}; - cdl_option CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT { user_value 0 }; diff --git a/packages/io/fileio/current/ChangeLog b/packages/io/fileio/current/ChangeLog --- a/packages/io/fileio/current/ChangeLog +++ b/packages/io/fileio/current/ChangeLog @@ -1,3 +1,13 @@ +2002-01-04 Wade Jensen +2002-01-04 Jonathan Larmour + + * src/socket.cxx (recvfrom): Set msg.msg_namelen correctly for + NULL fromlen. + +2001-12-28 Gary Thomas + + * src/io.cxx (readwrite): Add missing check for return (errors). + 2001-11-29 Jonathan Larmour * src/file.cxx (chdir): Don't detach from current dir if unset. diff --git a/packages/io/fileio/current/src/io.cxx b/packages/io/fileio/current/src/io.cxx --- a/packages/io/fileio/current/src/io.cxx +++ b/packages/io/fileio/current/src/io.cxx @@ -125,6 +125,9 @@ static ssize_t readwrite( int fd, void * cyg_fp_free( fp ); CYG_CANCELLATION_POINT; + + if( ret != 0 ) + FILEIO_RETURN(ret); FILEIO_RETURN_VALUE(cnt); } diff --git a/packages/io/fileio/current/src/socket.cxx b/packages/io/fileio/current/src/socket.cxx --- a/packages/io/fileio/current/src/socket.cxx +++ b/packages/io/fileio/current/src/socket.cxx @@ -497,14 +497,14 @@ Cyg_Mutex nstab_lock[CYGNUM_FILEIO_NSTAB cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops; // Set up a message header... - msg.msg_name = (caddr_t)from; - msg.msg_namelen = *fromlen; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - iov.iov_base = buf; - iov.iov_len = len; - msg.msg_control = 0; - msg.msg_flags = flags; + msg.msg_name = (caddr_t)from; + msg.msg_namelen = fromlen ? *fromlen : 0; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + iov.iov_base = buf; + iov.iov_len = len; + msg.msg_control = 0; + msg.msg_flags = flags; LOCK_SOCKET( fp ); diff --git a/packages/redboot/current/ChangeLog b/packages/redboot/current/ChangeLog --- a/packages/redboot/current/ChangeLog +++ b/packages/redboot/current/ChangeLog @@ -1,3 +1,10 @@ +2002-01-03 Gary Thomas + + * src/xyzModem.c (xyzModem_stream_read): BUG 57497 + Try and detect (and remove) ^Z characters placed at end of stream. + This data confuses higher processing, like the zlib decompression + routines. + 2001-12-16 Mark Salter * src/fs/ide.c: Add ATAPI support. @@ -1938,7 +1945,7 @@ 2000-07-12 Gary Thomas