18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci ppc6lnx.c (c) 2001 Micro Solutions Inc. 38c2ecf20Sopenharmony_ci Released under the terms of the GNU General Public license 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci ppc6lnx.c is a par of the protocol driver for the Micro Solutions 68c2ecf20Sopenharmony_ci "BACKPACK" parallel port IDE adapter 78c2ecf20Sopenharmony_ci (Works on Series 6 drives) 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci*/ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci//*************************************************************************** 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci// PPC 6 Code in C sanitized for LINUX 148c2ecf20Sopenharmony_ci// Original x86 ASM by Ron, Converted to C by Clive 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci//*************************************************************************** 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#define port_stb 1 208c2ecf20Sopenharmony_ci#define port_afd 2 218c2ecf20Sopenharmony_ci#define cmd_stb port_afd 228c2ecf20Sopenharmony_ci#define port_init 4 238c2ecf20Sopenharmony_ci#define data_stb port_init 248c2ecf20Sopenharmony_ci#define port_sel 8 258c2ecf20Sopenharmony_ci#define port_int 16 268c2ecf20Sopenharmony_ci#define port_dir 0x20 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define ECR_EPP 0x80 298c2ecf20Sopenharmony_ci#define ECR_BI 0x20 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci//*************************************************************************** 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci// 60772 Commands 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci#define ACCESS_REG 0x00 368c2ecf20Sopenharmony_ci#define ACCESS_PORT 0x40 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#define ACCESS_READ 0x00 398c2ecf20Sopenharmony_ci#define ACCESS_WRITE 0x20 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci// 60772 Command Prefix 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci#define CMD_PREFIX_SET 0xe0 // Special command that modifies the next command's operation 448c2ecf20Sopenharmony_ci#define CMD_PREFIX_RESET 0xc0 // Resets current cmd modifier reg bits 458c2ecf20Sopenharmony_ci #define PREFIX_IO16 0x01 // perform 16-bit wide I/O 468c2ecf20Sopenharmony_ci #define PREFIX_FASTWR 0x04 // enable PPC mode fast-write 478c2ecf20Sopenharmony_ci #define PREFIX_BLK 0x08 // enable block transfer mode 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci// 60772 Registers 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#define REG_STATUS 0x00 // status register 528c2ecf20Sopenharmony_ci #define STATUS_IRQA 0x01 // Peripheral IRQA line 538c2ecf20Sopenharmony_ci #define STATUS_EEPROM_DO 0x40 // Serial EEPROM data bit 548c2ecf20Sopenharmony_ci#define REG_VERSION 0x01 // PPC version register (read) 558c2ecf20Sopenharmony_ci#define REG_HWCFG 0x02 // Hardware Config register 568c2ecf20Sopenharmony_ci#define REG_RAMSIZE 0x03 // Size of RAM Buffer 578c2ecf20Sopenharmony_ci #define RAMSIZE_128K 0x02 588c2ecf20Sopenharmony_ci#define REG_EEPROM 0x06 // EEPROM control register 598c2ecf20Sopenharmony_ci #define EEPROM_SK 0x01 // eeprom SK bit 608c2ecf20Sopenharmony_ci #define EEPROM_DI 0x02 // eeprom DI bit 618c2ecf20Sopenharmony_ci #define EEPROM_CS 0x04 // eeprom CS bit 628c2ecf20Sopenharmony_ci #define EEPROM_EN 0x08 // eeprom output enable 638c2ecf20Sopenharmony_ci#define REG_BLKSIZE 0x08 // Block transfer len (24 bit) 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci//*************************************************************************** 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_citypedef struct ppc_storage { 688c2ecf20Sopenharmony_ci u16 lpt_addr; // LPT base address 698c2ecf20Sopenharmony_ci u8 ppc_id; 708c2ecf20Sopenharmony_ci u8 mode; // operating mode 718c2ecf20Sopenharmony_ci // 0 = PPC Uni SW 728c2ecf20Sopenharmony_ci // 1 = PPC Uni FW 738c2ecf20Sopenharmony_ci // 2 = PPC Bi SW 748c2ecf20Sopenharmony_ci // 3 = PPC Bi FW 758c2ecf20Sopenharmony_ci // 4 = EPP Byte 768c2ecf20Sopenharmony_ci // 5 = EPP Word 778c2ecf20Sopenharmony_ci // 6 = EPP Dword 788c2ecf20Sopenharmony_ci u8 ppc_flags; 798c2ecf20Sopenharmony_ci u8 org_data; // original LPT data port contents 808c2ecf20Sopenharmony_ci u8 org_ctrl; // original LPT control port contents 818c2ecf20Sopenharmony_ci u8 cur_ctrl; // current control port contents 828c2ecf20Sopenharmony_ci} Interface; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci//*************************************************************************** 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci// ppc_flags 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci#define fifo_wait 0x10 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci//*************************************************************************** 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci// DONT CHANGE THESE LEST YOU BREAK EVERYTHING - BIT FIELD DEPENDENCIES 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci#define PPCMODE_UNI_SW 0 958c2ecf20Sopenharmony_ci#define PPCMODE_UNI_FW 1 968c2ecf20Sopenharmony_ci#define PPCMODE_BI_SW 2 978c2ecf20Sopenharmony_ci#define PPCMODE_BI_FW 3 988c2ecf20Sopenharmony_ci#define PPCMODE_EPP_BYTE 4 998c2ecf20Sopenharmony_ci#define PPCMODE_EPP_WORD 5 1008c2ecf20Sopenharmony_ci#define PPCMODE_EPP_DWORD 6 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci//*************************************************************************** 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_cistatic int ppc6_select(Interface *ppc); 1058c2ecf20Sopenharmony_cistatic void ppc6_deselect(Interface *ppc); 1068c2ecf20Sopenharmony_cistatic void ppc6_send_cmd(Interface *ppc, u8 cmd); 1078c2ecf20Sopenharmony_cistatic void ppc6_wr_data_byte(Interface *ppc, u8 data); 1088c2ecf20Sopenharmony_cistatic u8 ppc6_rd_data_byte(Interface *ppc); 1098c2ecf20Sopenharmony_cistatic u8 ppc6_rd_port(Interface *ppc, u8 port); 1108c2ecf20Sopenharmony_cistatic void ppc6_wr_port(Interface *ppc, u8 port, u8 data); 1118c2ecf20Sopenharmony_cistatic void ppc6_rd_data_blk(Interface *ppc, u8 *data, long count); 1128c2ecf20Sopenharmony_cistatic void ppc6_wait_for_fifo(Interface *ppc); 1138c2ecf20Sopenharmony_cistatic void ppc6_wr_data_blk(Interface *ppc, u8 *data, long count); 1148c2ecf20Sopenharmony_cistatic void ppc6_rd_port16_blk(Interface *ppc, u8 port, u8 *data, long length); 1158c2ecf20Sopenharmony_cistatic void ppc6_wr_port16_blk(Interface *ppc, u8 port, u8 *data, long length); 1168c2ecf20Sopenharmony_cistatic void ppc6_wr_extout(Interface *ppc, u8 regdata); 1178c2ecf20Sopenharmony_cistatic int ppc6_open(Interface *ppc); 1188c2ecf20Sopenharmony_cistatic void ppc6_close(Interface *ppc); 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci//*************************************************************************** 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cistatic int ppc6_select(Interface *ppc) 1238c2ecf20Sopenharmony_ci{ 1248c2ecf20Sopenharmony_ci u8 i, j, k; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci i = inb(ppc->lpt_addr + 1); 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci if (i & 1) 1298c2ecf20Sopenharmony_ci outb(i, ppc->lpt_addr + 1); 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci ppc->org_data = inb(ppc->lpt_addr); 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci ppc->org_ctrl = inb(ppc->lpt_addr + 2) & 0x5F; // readback ctrl 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci ppc->cur_ctrl = ppc->org_ctrl; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_sel; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci if (ppc->org_data == 'b') 1428c2ecf20Sopenharmony_ci outb('x', ppc->lpt_addr); 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci outb('b', ppc->lpt_addr); 1458c2ecf20Sopenharmony_ci outb('p', ppc->lpt_addr); 1468c2ecf20Sopenharmony_ci outb(ppc->ppc_id, ppc->lpt_addr); 1478c2ecf20Sopenharmony_ci outb(~ppc->ppc_id,ppc->lpt_addr); 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci ppc->cur_ctrl &= ~port_sel; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci ppc->cur_ctrl = (ppc->cur_ctrl & port_int) | port_init; 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci i = ppc->mode & 0x0C; 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci if (i == 0) 1608c2ecf20Sopenharmony_ci i = (ppc->mode & 2) | 1; 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci outb(i, ppc->lpt_addr); 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_sel; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci // DELAY 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_afd; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci j = ((i & 0x08) << 4) | ((i & 0x07) << 3); 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci k = inb(ppc->lpt_addr + 1) & 0xB8; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci if (j == k) 1798c2ecf20Sopenharmony_ci { 1808c2ecf20Sopenharmony_ci ppc->cur_ctrl &= ~port_afd; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci k = (inb(ppc->lpt_addr + 1) & 0xB8) ^ 0xB8; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci if (j == k) 1878c2ecf20Sopenharmony_ci { 1888c2ecf20Sopenharmony_ci if (i & 4) // EPP 1898c2ecf20Sopenharmony_ci ppc->cur_ctrl &= ~(port_sel | port_init); 1908c2ecf20Sopenharmony_ci else // PPC/ECP 1918c2ecf20Sopenharmony_ci ppc->cur_ctrl &= ~port_sel; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci return(1); 1968c2ecf20Sopenharmony_ci } 1978c2ecf20Sopenharmony_ci } 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci outb(ppc->org_ctrl, ppc->lpt_addr + 2); 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci outb(ppc->org_data, ppc->lpt_addr); 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci return(0); // FAIL 2048c2ecf20Sopenharmony_ci} 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci//*************************************************************************** 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_cistatic void ppc6_deselect(Interface *ppc) 2098c2ecf20Sopenharmony_ci{ 2108c2ecf20Sopenharmony_ci if (ppc->mode & 4) // EPP 2118c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_init; 2128c2ecf20Sopenharmony_ci else // PPC/ECP 2138c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_sel; 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci outb(ppc->org_data, ppc->lpt_addr); 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci outb((ppc->org_ctrl | port_sel), ppc->lpt_addr + 2); 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci outb(ppc->org_ctrl, ppc->lpt_addr + 2); 2228c2ecf20Sopenharmony_ci} 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci//*************************************************************************** 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_cistatic void ppc6_send_cmd(Interface *ppc, u8 cmd) 2278c2ecf20Sopenharmony_ci{ 2288c2ecf20Sopenharmony_ci switch(ppc->mode) 2298c2ecf20Sopenharmony_ci { 2308c2ecf20Sopenharmony_ci case PPCMODE_UNI_SW : 2318c2ecf20Sopenharmony_ci case PPCMODE_UNI_FW : 2328c2ecf20Sopenharmony_ci case PPCMODE_BI_SW : 2338c2ecf20Sopenharmony_ci case PPCMODE_BI_FW : 2348c2ecf20Sopenharmony_ci { 2358c2ecf20Sopenharmony_ci outb(cmd, ppc->lpt_addr); 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci ppc->cur_ctrl ^= cmd_stb; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci break; 2428c2ecf20Sopenharmony_ci } 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci case PPCMODE_EPP_BYTE : 2458c2ecf20Sopenharmony_ci case PPCMODE_EPP_WORD : 2468c2ecf20Sopenharmony_ci case PPCMODE_EPP_DWORD : 2478c2ecf20Sopenharmony_ci { 2488c2ecf20Sopenharmony_ci outb(cmd, ppc->lpt_addr + 3); 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_ci break; 2518c2ecf20Sopenharmony_ci } 2528c2ecf20Sopenharmony_ci } 2538c2ecf20Sopenharmony_ci} 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci//*************************************************************************** 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_cistatic void ppc6_wr_data_byte(Interface *ppc, u8 data) 2588c2ecf20Sopenharmony_ci{ 2598c2ecf20Sopenharmony_ci switch(ppc->mode) 2608c2ecf20Sopenharmony_ci { 2618c2ecf20Sopenharmony_ci case PPCMODE_UNI_SW : 2628c2ecf20Sopenharmony_ci case PPCMODE_UNI_FW : 2638c2ecf20Sopenharmony_ci case PPCMODE_BI_SW : 2648c2ecf20Sopenharmony_ci case PPCMODE_BI_FW : 2658c2ecf20Sopenharmony_ci { 2668c2ecf20Sopenharmony_ci outb(data, ppc->lpt_addr); 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci ppc->cur_ctrl ^= data_stb; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci break; 2738c2ecf20Sopenharmony_ci } 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci case PPCMODE_EPP_BYTE : 2768c2ecf20Sopenharmony_ci case PPCMODE_EPP_WORD : 2778c2ecf20Sopenharmony_ci case PPCMODE_EPP_DWORD : 2788c2ecf20Sopenharmony_ci { 2798c2ecf20Sopenharmony_ci outb(data, ppc->lpt_addr + 4); 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci break; 2828c2ecf20Sopenharmony_ci } 2838c2ecf20Sopenharmony_ci } 2848c2ecf20Sopenharmony_ci} 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci//*************************************************************************** 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_cistatic u8 ppc6_rd_data_byte(Interface *ppc) 2898c2ecf20Sopenharmony_ci{ 2908c2ecf20Sopenharmony_ci u8 data = 0; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci switch(ppc->mode) 2938c2ecf20Sopenharmony_ci { 2948c2ecf20Sopenharmony_ci case PPCMODE_UNI_SW : 2958c2ecf20Sopenharmony_ci case PPCMODE_UNI_FW : 2968c2ecf20Sopenharmony_ci { 2978c2ecf20Sopenharmony_ci ppc->cur_ctrl = (ppc->cur_ctrl & ~port_stb) ^ data_stb; 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci // DELAY 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ci data = inb(ppc->lpt_addr + 1); 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci data = ((data & 0x80) >> 1) | ((data & 0x38) >> 3); 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_stb; 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ci // DELAY 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci data |= inb(ppc->lpt_addr + 1) & 0xB8; 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci break; 3168c2ecf20Sopenharmony_ci } 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci case PPCMODE_BI_SW : 3198c2ecf20Sopenharmony_ci case PPCMODE_BI_FW : 3208c2ecf20Sopenharmony_ci { 3218c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_dir; 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci ppc->cur_ctrl = (ppc->cur_ctrl | port_stb) ^ data_stb; 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ci data = inb(ppc->lpt_addr); 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci ppc->cur_ctrl &= ~port_stb; 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl,ppc->lpt_addr + 2); 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci ppc->cur_ctrl &= ~port_dir; 3368c2ecf20Sopenharmony_ci 3378c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci break; 3408c2ecf20Sopenharmony_ci } 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_ci case PPCMODE_EPP_BYTE : 3438c2ecf20Sopenharmony_ci case PPCMODE_EPP_WORD : 3448c2ecf20Sopenharmony_ci case PPCMODE_EPP_DWORD : 3458c2ecf20Sopenharmony_ci { 3468c2ecf20Sopenharmony_ci outb((ppc->cur_ctrl | port_dir),ppc->lpt_addr + 2); 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_ci data = inb(ppc->lpt_addr + 4); 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl,ppc->lpt_addr + 2); 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci break; 3538c2ecf20Sopenharmony_ci } 3548c2ecf20Sopenharmony_ci } 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci return(data); 3578c2ecf20Sopenharmony_ci} 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ci//*************************************************************************** 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_cistatic u8 ppc6_rd_port(Interface *ppc, u8 port) 3628c2ecf20Sopenharmony_ci{ 3638c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc,(u8)(port | ACCESS_PORT | ACCESS_READ)); 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci return(ppc6_rd_data_byte(ppc)); 3668c2ecf20Sopenharmony_ci} 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ci//*************************************************************************** 3698c2ecf20Sopenharmony_ci 3708c2ecf20Sopenharmony_cistatic void ppc6_wr_port(Interface *ppc, u8 port, u8 data) 3718c2ecf20Sopenharmony_ci{ 3728c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc,(u8)(port | ACCESS_PORT | ACCESS_WRITE)); 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci ppc6_wr_data_byte(ppc, data); 3758c2ecf20Sopenharmony_ci} 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci//*************************************************************************** 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_cistatic void ppc6_rd_data_blk(Interface *ppc, u8 *data, long count) 3808c2ecf20Sopenharmony_ci{ 3818c2ecf20Sopenharmony_ci switch(ppc->mode) 3828c2ecf20Sopenharmony_ci { 3838c2ecf20Sopenharmony_ci case PPCMODE_UNI_SW : 3848c2ecf20Sopenharmony_ci case PPCMODE_UNI_FW : 3858c2ecf20Sopenharmony_ci { 3868c2ecf20Sopenharmony_ci while(count) 3878c2ecf20Sopenharmony_ci { 3888c2ecf20Sopenharmony_ci u8 d; 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci ppc->cur_ctrl = (ppc->cur_ctrl & ~port_stb) ^ data_stb; 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ci // DELAY 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_ci d = inb(ppc->lpt_addr + 1); 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ci d = ((d & 0x80) >> 1) | ((d & 0x38) >> 3); 3998c2ecf20Sopenharmony_ci 4008c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_stb; 4018c2ecf20Sopenharmony_ci 4028c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_ci // DELAY 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_ci d |= inb(ppc->lpt_addr + 1) & 0xB8; 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ci *data++ = d; 4098c2ecf20Sopenharmony_ci count--; 4108c2ecf20Sopenharmony_ci } 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_ci break; 4138c2ecf20Sopenharmony_ci } 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci case PPCMODE_BI_SW : 4168c2ecf20Sopenharmony_ci case PPCMODE_BI_FW : 4178c2ecf20Sopenharmony_ci { 4188c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_dir; 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_stb; 4238c2ecf20Sopenharmony_ci 4248c2ecf20Sopenharmony_ci while(count) 4258c2ecf20Sopenharmony_ci { 4268c2ecf20Sopenharmony_ci ppc->cur_ctrl ^= data_stb; 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 4298c2ecf20Sopenharmony_ci 4308c2ecf20Sopenharmony_ci *data++ = inb(ppc->lpt_addr); 4318c2ecf20Sopenharmony_ci count--; 4328c2ecf20Sopenharmony_ci } 4338c2ecf20Sopenharmony_ci 4348c2ecf20Sopenharmony_ci ppc->cur_ctrl &= ~port_stb; 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_ci ppc->cur_ctrl &= ~port_dir; 4398c2ecf20Sopenharmony_ci 4408c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 4418c2ecf20Sopenharmony_ci 4428c2ecf20Sopenharmony_ci break; 4438c2ecf20Sopenharmony_ci } 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_ci case PPCMODE_EPP_BYTE : 4468c2ecf20Sopenharmony_ci { 4478c2ecf20Sopenharmony_ci outb((ppc->cur_ctrl | port_dir), ppc->lpt_addr + 2); 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_ci // DELAY 4508c2ecf20Sopenharmony_ci 4518c2ecf20Sopenharmony_ci while(count) 4528c2ecf20Sopenharmony_ci { 4538c2ecf20Sopenharmony_ci *data++ = inb(ppc->lpt_addr + 4); 4548c2ecf20Sopenharmony_ci count--; 4558c2ecf20Sopenharmony_ci } 4568c2ecf20Sopenharmony_ci 4578c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 4588c2ecf20Sopenharmony_ci 4598c2ecf20Sopenharmony_ci break; 4608c2ecf20Sopenharmony_ci } 4618c2ecf20Sopenharmony_ci 4628c2ecf20Sopenharmony_ci case PPCMODE_EPP_WORD : 4638c2ecf20Sopenharmony_ci { 4648c2ecf20Sopenharmony_ci outb((ppc->cur_ctrl | port_dir), ppc->lpt_addr + 2); 4658c2ecf20Sopenharmony_ci 4668c2ecf20Sopenharmony_ci // DELAY 4678c2ecf20Sopenharmony_ci 4688c2ecf20Sopenharmony_ci while(count > 1) 4698c2ecf20Sopenharmony_ci { 4708c2ecf20Sopenharmony_ci *((u16 *)data) = inw(ppc->lpt_addr + 4); 4718c2ecf20Sopenharmony_ci data += 2; 4728c2ecf20Sopenharmony_ci count -= 2; 4738c2ecf20Sopenharmony_ci } 4748c2ecf20Sopenharmony_ci 4758c2ecf20Sopenharmony_ci while(count) 4768c2ecf20Sopenharmony_ci { 4778c2ecf20Sopenharmony_ci *data++ = inb(ppc->lpt_addr + 4); 4788c2ecf20Sopenharmony_ci count--; 4798c2ecf20Sopenharmony_ci } 4808c2ecf20Sopenharmony_ci 4818c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 4828c2ecf20Sopenharmony_ci 4838c2ecf20Sopenharmony_ci break; 4848c2ecf20Sopenharmony_ci } 4858c2ecf20Sopenharmony_ci 4868c2ecf20Sopenharmony_ci case PPCMODE_EPP_DWORD : 4878c2ecf20Sopenharmony_ci { 4888c2ecf20Sopenharmony_ci outb((ppc->cur_ctrl | port_dir),ppc->lpt_addr + 2); 4898c2ecf20Sopenharmony_ci 4908c2ecf20Sopenharmony_ci // DELAY 4918c2ecf20Sopenharmony_ci 4928c2ecf20Sopenharmony_ci while(count > 3) 4938c2ecf20Sopenharmony_ci { 4948c2ecf20Sopenharmony_ci *((u32 *)data) = inl(ppc->lpt_addr + 4); 4958c2ecf20Sopenharmony_ci data += 4; 4968c2ecf20Sopenharmony_ci count -= 4; 4978c2ecf20Sopenharmony_ci } 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_ci while(count) 5008c2ecf20Sopenharmony_ci { 5018c2ecf20Sopenharmony_ci *data++ = inb(ppc->lpt_addr + 4); 5028c2ecf20Sopenharmony_ci count--; 5038c2ecf20Sopenharmony_ci } 5048c2ecf20Sopenharmony_ci 5058c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 5068c2ecf20Sopenharmony_ci 5078c2ecf20Sopenharmony_ci break; 5088c2ecf20Sopenharmony_ci } 5098c2ecf20Sopenharmony_ci } 5108c2ecf20Sopenharmony_ci 5118c2ecf20Sopenharmony_ci} 5128c2ecf20Sopenharmony_ci 5138c2ecf20Sopenharmony_ci//*************************************************************************** 5148c2ecf20Sopenharmony_ci 5158c2ecf20Sopenharmony_cistatic void ppc6_wait_for_fifo(Interface *ppc) 5168c2ecf20Sopenharmony_ci{ 5178c2ecf20Sopenharmony_ci int i; 5188c2ecf20Sopenharmony_ci 5198c2ecf20Sopenharmony_ci if (ppc->ppc_flags & fifo_wait) 5208c2ecf20Sopenharmony_ci { 5218c2ecf20Sopenharmony_ci for(i=0; i<20; i++) 5228c2ecf20Sopenharmony_ci inb(ppc->lpt_addr + 1); 5238c2ecf20Sopenharmony_ci } 5248c2ecf20Sopenharmony_ci} 5258c2ecf20Sopenharmony_ci 5268c2ecf20Sopenharmony_ci//*************************************************************************** 5278c2ecf20Sopenharmony_ci 5288c2ecf20Sopenharmony_cistatic void ppc6_wr_data_blk(Interface *ppc, u8 *data, long count) 5298c2ecf20Sopenharmony_ci{ 5308c2ecf20Sopenharmony_ci switch(ppc->mode) 5318c2ecf20Sopenharmony_ci { 5328c2ecf20Sopenharmony_ci case PPCMODE_UNI_SW : 5338c2ecf20Sopenharmony_ci case PPCMODE_BI_SW : 5348c2ecf20Sopenharmony_ci { 5358c2ecf20Sopenharmony_ci while(count--) 5368c2ecf20Sopenharmony_ci { 5378c2ecf20Sopenharmony_ci outb(*data++, ppc->lpt_addr); 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_ci ppc->cur_ctrl ^= data_stb; 5408c2ecf20Sopenharmony_ci 5418c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 5428c2ecf20Sopenharmony_ci } 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_ci break; 5458c2ecf20Sopenharmony_ci } 5468c2ecf20Sopenharmony_ci 5478c2ecf20Sopenharmony_ci case PPCMODE_UNI_FW : 5488c2ecf20Sopenharmony_ci case PPCMODE_BI_FW : 5498c2ecf20Sopenharmony_ci { 5508c2ecf20Sopenharmony_ci u8 this, last; 5518c2ecf20Sopenharmony_ci 5528c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc,(CMD_PREFIX_SET | PREFIX_FASTWR)); 5538c2ecf20Sopenharmony_ci 5548c2ecf20Sopenharmony_ci ppc->cur_ctrl |= port_stb; 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_ci last = *data; 5598c2ecf20Sopenharmony_ci 5608c2ecf20Sopenharmony_ci outb(last, ppc->lpt_addr); 5618c2ecf20Sopenharmony_ci 5628c2ecf20Sopenharmony_ci while(count) 5638c2ecf20Sopenharmony_ci { 5648c2ecf20Sopenharmony_ci this = *data++; 5658c2ecf20Sopenharmony_ci count--; 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_ci if (this == last) 5688c2ecf20Sopenharmony_ci { 5698c2ecf20Sopenharmony_ci ppc->cur_ctrl ^= data_stb; 5708c2ecf20Sopenharmony_ci 5718c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 5728c2ecf20Sopenharmony_ci } 5738c2ecf20Sopenharmony_ci else 5748c2ecf20Sopenharmony_ci { 5758c2ecf20Sopenharmony_ci outb(this, ppc->lpt_addr); 5768c2ecf20Sopenharmony_ci 5778c2ecf20Sopenharmony_ci last = this; 5788c2ecf20Sopenharmony_ci } 5798c2ecf20Sopenharmony_ci } 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ci ppc->cur_ctrl &= ~port_stb; 5828c2ecf20Sopenharmony_ci 5838c2ecf20Sopenharmony_ci outb(ppc->cur_ctrl, ppc->lpt_addr + 2); 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc,(CMD_PREFIX_RESET | PREFIX_FASTWR)); 5868c2ecf20Sopenharmony_ci 5878c2ecf20Sopenharmony_ci break; 5888c2ecf20Sopenharmony_ci } 5898c2ecf20Sopenharmony_ci 5908c2ecf20Sopenharmony_ci case PPCMODE_EPP_BYTE : 5918c2ecf20Sopenharmony_ci { 5928c2ecf20Sopenharmony_ci while(count) 5938c2ecf20Sopenharmony_ci { 5948c2ecf20Sopenharmony_ci outb(*data++,ppc->lpt_addr + 4); 5958c2ecf20Sopenharmony_ci count--; 5968c2ecf20Sopenharmony_ci } 5978c2ecf20Sopenharmony_ci 5988c2ecf20Sopenharmony_ci ppc6_wait_for_fifo(ppc); 5998c2ecf20Sopenharmony_ci 6008c2ecf20Sopenharmony_ci break; 6018c2ecf20Sopenharmony_ci } 6028c2ecf20Sopenharmony_ci 6038c2ecf20Sopenharmony_ci case PPCMODE_EPP_WORD : 6048c2ecf20Sopenharmony_ci { 6058c2ecf20Sopenharmony_ci while(count > 1) 6068c2ecf20Sopenharmony_ci { 6078c2ecf20Sopenharmony_ci outw(*((u16 *)data),ppc->lpt_addr + 4); 6088c2ecf20Sopenharmony_ci data += 2; 6098c2ecf20Sopenharmony_ci count -= 2; 6108c2ecf20Sopenharmony_ci } 6118c2ecf20Sopenharmony_ci 6128c2ecf20Sopenharmony_ci while(count) 6138c2ecf20Sopenharmony_ci { 6148c2ecf20Sopenharmony_ci outb(*data++,ppc->lpt_addr + 4); 6158c2ecf20Sopenharmony_ci count--; 6168c2ecf20Sopenharmony_ci } 6178c2ecf20Sopenharmony_ci 6188c2ecf20Sopenharmony_ci ppc6_wait_for_fifo(ppc); 6198c2ecf20Sopenharmony_ci 6208c2ecf20Sopenharmony_ci break; 6218c2ecf20Sopenharmony_ci } 6228c2ecf20Sopenharmony_ci 6238c2ecf20Sopenharmony_ci case PPCMODE_EPP_DWORD : 6248c2ecf20Sopenharmony_ci { 6258c2ecf20Sopenharmony_ci while(count > 3) 6268c2ecf20Sopenharmony_ci { 6278c2ecf20Sopenharmony_ci outl(*((u32 *)data),ppc->lpt_addr + 4); 6288c2ecf20Sopenharmony_ci data += 4; 6298c2ecf20Sopenharmony_ci count -= 4; 6308c2ecf20Sopenharmony_ci } 6318c2ecf20Sopenharmony_ci 6328c2ecf20Sopenharmony_ci while(count) 6338c2ecf20Sopenharmony_ci { 6348c2ecf20Sopenharmony_ci outb(*data++,ppc->lpt_addr + 4); 6358c2ecf20Sopenharmony_ci count--; 6368c2ecf20Sopenharmony_ci } 6378c2ecf20Sopenharmony_ci 6388c2ecf20Sopenharmony_ci ppc6_wait_for_fifo(ppc); 6398c2ecf20Sopenharmony_ci 6408c2ecf20Sopenharmony_ci break; 6418c2ecf20Sopenharmony_ci } 6428c2ecf20Sopenharmony_ci } 6438c2ecf20Sopenharmony_ci} 6448c2ecf20Sopenharmony_ci 6458c2ecf20Sopenharmony_ci//*************************************************************************** 6468c2ecf20Sopenharmony_ci 6478c2ecf20Sopenharmony_cistatic void ppc6_rd_port16_blk(Interface *ppc, u8 port, u8 *data, long length) 6488c2ecf20Sopenharmony_ci{ 6498c2ecf20Sopenharmony_ci length = length << 1; 6508c2ecf20Sopenharmony_ci 6518c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (REG_BLKSIZE | ACCESS_REG | ACCESS_WRITE)); 6528c2ecf20Sopenharmony_ci ppc6_wr_data_byte(ppc,(u8)length); 6538c2ecf20Sopenharmony_ci ppc6_wr_data_byte(ppc,(u8)(length >> 8)); 6548c2ecf20Sopenharmony_ci ppc6_wr_data_byte(ppc,0); 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (CMD_PREFIX_SET | PREFIX_IO16 | PREFIX_BLK)); 6578c2ecf20Sopenharmony_ci 6588c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (u8)(port | ACCESS_PORT | ACCESS_READ)); 6598c2ecf20Sopenharmony_ci 6608c2ecf20Sopenharmony_ci ppc6_rd_data_blk(ppc, data, length); 6618c2ecf20Sopenharmony_ci 6628c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (CMD_PREFIX_RESET | PREFIX_IO16 | PREFIX_BLK)); 6638c2ecf20Sopenharmony_ci} 6648c2ecf20Sopenharmony_ci 6658c2ecf20Sopenharmony_ci//*************************************************************************** 6668c2ecf20Sopenharmony_ci 6678c2ecf20Sopenharmony_cistatic void ppc6_wr_port16_blk(Interface *ppc, u8 port, u8 *data, long length) 6688c2ecf20Sopenharmony_ci{ 6698c2ecf20Sopenharmony_ci length = length << 1; 6708c2ecf20Sopenharmony_ci 6718c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (REG_BLKSIZE | ACCESS_REG | ACCESS_WRITE)); 6728c2ecf20Sopenharmony_ci ppc6_wr_data_byte(ppc,(u8)length); 6738c2ecf20Sopenharmony_ci ppc6_wr_data_byte(ppc,(u8)(length >> 8)); 6748c2ecf20Sopenharmony_ci ppc6_wr_data_byte(ppc,0); 6758c2ecf20Sopenharmony_ci 6768c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (CMD_PREFIX_SET | PREFIX_IO16 | PREFIX_BLK)); 6778c2ecf20Sopenharmony_ci 6788c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (u8)(port | ACCESS_PORT | ACCESS_WRITE)); 6798c2ecf20Sopenharmony_ci 6808c2ecf20Sopenharmony_ci ppc6_wr_data_blk(ppc, data, length); 6818c2ecf20Sopenharmony_ci 6828c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (CMD_PREFIX_RESET | PREFIX_IO16 | PREFIX_BLK)); 6838c2ecf20Sopenharmony_ci} 6848c2ecf20Sopenharmony_ci 6858c2ecf20Sopenharmony_ci//*************************************************************************** 6868c2ecf20Sopenharmony_ci 6878c2ecf20Sopenharmony_cistatic void ppc6_wr_extout(Interface *ppc, u8 regdata) 6888c2ecf20Sopenharmony_ci{ 6898c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc,(REG_VERSION | ACCESS_REG | ACCESS_WRITE)); 6908c2ecf20Sopenharmony_ci 6918c2ecf20Sopenharmony_ci ppc6_wr_data_byte(ppc, (u8)((regdata & 0x03) << 6)); 6928c2ecf20Sopenharmony_ci} 6938c2ecf20Sopenharmony_ci 6948c2ecf20Sopenharmony_ci//*************************************************************************** 6958c2ecf20Sopenharmony_ci 6968c2ecf20Sopenharmony_cistatic int ppc6_open(Interface *ppc) 6978c2ecf20Sopenharmony_ci{ 6988c2ecf20Sopenharmony_ci int ret; 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_ci ret = ppc6_select(ppc); 7018c2ecf20Sopenharmony_ci 7028c2ecf20Sopenharmony_ci if (ret == 0) 7038c2ecf20Sopenharmony_ci return(ret); 7048c2ecf20Sopenharmony_ci 7058c2ecf20Sopenharmony_ci ppc->ppc_flags &= ~fifo_wait; 7068c2ecf20Sopenharmony_ci 7078c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (ACCESS_REG | ACCESS_WRITE | REG_RAMSIZE)); 7088c2ecf20Sopenharmony_ci ppc6_wr_data_byte(ppc, RAMSIZE_128K); 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_ci ppc6_send_cmd(ppc, (ACCESS_REG | ACCESS_READ | REG_VERSION)); 7118c2ecf20Sopenharmony_ci 7128c2ecf20Sopenharmony_ci if ((ppc6_rd_data_byte(ppc) & 0x3F) == 0x0C) 7138c2ecf20Sopenharmony_ci ppc->ppc_flags |= fifo_wait; 7148c2ecf20Sopenharmony_ci 7158c2ecf20Sopenharmony_ci return(ret); 7168c2ecf20Sopenharmony_ci} 7178c2ecf20Sopenharmony_ci 7188c2ecf20Sopenharmony_ci//*************************************************************************** 7198c2ecf20Sopenharmony_ci 7208c2ecf20Sopenharmony_cistatic void ppc6_close(Interface *ppc) 7218c2ecf20Sopenharmony_ci{ 7228c2ecf20Sopenharmony_ci ppc6_deselect(ppc); 7238c2ecf20Sopenharmony_ci} 7248c2ecf20Sopenharmony_ci 7258c2ecf20Sopenharmony_ci//*************************************************************************** 7268c2ecf20Sopenharmony_ci 727