Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * RapidIO Tsi500 switch support
  3  *
  4  * Copyright 2005 MontaVista Software, Inc.
  5  * Matt Porter <mporter@kernel.crashing.org>
  6  *
  7  * This program is free software; you can redistribute  it and/or modify it
  8  * under  the terms of  the GNU General  Public License as published by the
  9  * Free Software Foundation;  either version 2 of the  License, or (at your
 10  * option) any later version.
 11  */
 12 
 13 #include <linux/rio.h>
 14 #include <linux/rio_drv.h>
 15 #include <linux/rio_ids.h>
 16 #include "../rio.h"
 17 
 18 static int
 19 tsi500_route_add_entry(struct rio_mport *mport, u16 destid, u8 hopcount, u16 table, u16 route_destid, u8 route_port)
 20 {
 21         int i;
 22         u32 offset = 0x10000 + 0xa00 + ((route_destid / 2)&~0x3);
 23         u32 result;
 24 
 25         if (table == 0xff) {
 26                 rio_mport_read_config_32(mport, destid, hopcount, offset, &result);
 27                 result &= ~(0xf << (4*(route_destid & 0x7)));
 28                 for (i=0;i<4;i++)
 29                         rio_mport_write_config_32(mport, destid, hopcount, offset + (0x20000*i), result | (route_port << (4*(route_destid & 0x7))));
 30         }
 31         else {
 32                 rio_mport_read_config_32(mport, destid, hopcount, offset + (0x20000*table), &result);
 33                 result &= ~(0xf << (4*(route_destid & 0x7)));
 34                 rio_mport_write_config_32(mport, destid, hopcount, offset + (0x20000*table), result | (route_port << (4*(route_destid & 0x7))));
 35         }
 36 
 37         return 0;
 38 }
 39 
 40 static int
 41 tsi500_route_get_entry(struct rio_mport *mport, u16 destid, u8 hopcount, u16 table, u16 route_destid, u8 *route_port)
 42 {
 43         int ret = 0;
 44         u32 offset = 0x10000 + 0xa00 + ((route_destid / 2)&~0x3);
 45         u32 result;
 46 
 47         if (table == 0xff)
 48                 rio_mport_read_config_32(mport, destid, hopcount, offset, &result);
 49         else
 50                 rio_mport_read_config_32(mport, destid, hopcount, offset + (0x20000*table), &result);
 51 
 52         result &= 0xf << (4*(route_destid & 0x7));
 53         *route_port = result >> (4*(route_destid & 0x7));
 54         if (*route_port > 3)
 55                 ret = -1;
 56 
 57         return ret;
 58 }
 59 
 60 DECLARE_RIO_ROUTE_OPS(RIO_VID_TUNDRA, RIO_DID_TSI500, tsi500_route_add_entry, tsi500_route_get_entry);
 61 
  This page was automatically generated by the LXR engine.